feat: rebuild xiteng.site homelab platform
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
import assert from "node:assert/strict";
|
||||
import {spawn} from "node:child_process";
|
||||
import {randomBytes} from "node:crypto";
|
||||
import {mkdtempSync, rmSync, writeFileSync} from "node:fs";
|
||||
import http from "node:http";
|
||||
import {tmpdir} from "node:os";
|
||||
import {join} from "node:path";
|
||||
|
||||
const directory = mkdtempSync(join(tmpdir(), "xiteng-key-vault-api-test-"));
|
||||
writeFileSync(join(directory, "master-key"), randomBytes(32).toString("base64"));
|
||||
writeFileSync(join(directory, "service-token"), "integration-service-token");
|
||||
|
||||
const portProbe = http.createServer();
|
||||
await new Promise((resolve) => portProbe.listen(0, "127.0.0.1", resolve));
|
||||
const port = portProbe.address().port;
|
||||
await new Promise((resolve) => portProbe.close(resolve));
|
||||
|
||||
const service = spawn(process.execPath, ["server.mjs"], {
|
||||
cwd: new URL(".", import.meta.url),
|
||||
env: {
|
||||
...process.env,
|
||||
PORT: String(port),
|
||||
DATABASE_PATH: join(directory, "vault.db"),
|
||||
MASTER_KEY_FILE: join(directory, "master-key"),
|
||||
SERVICE_TOKEN_FILE: join(directory, "service-token"),
|
||||
PROVIDER_CATALOG_FILE: new URL("providers.json", import.meta.url).pathname
|
||||
},
|
||||
stdio: ["ignore", "pipe", "pipe"]
|
||||
});
|
||||
let logs = "";
|
||||
service.stdout.on("data", (chunk) => { logs += chunk; });
|
||||
service.stderr.on("data", (chunk) => { logs += chunk; });
|
||||
|
||||
function request(pathname, {method = "GET", body} = {}) {
|
||||
return fetch(`http://127.0.0.1:${port}${pathname}`, {
|
||||
method,
|
||||
headers: {
|
||||
"Authorization": "Bearer integration-service-token",
|
||||
"Accept": "application/json",
|
||||
...(body ? {"Content-Type": "application/json"} : {}),
|
||||
"X-Key-Vault-Actor-Issuer": "https://auth.xiteng.site",
|
||||
"X-Key-Vault-Actor-Sub": "integration-user",
|
||||
"X-Key-Vault-Actor-Username": "integration"
|
||||
},
|
||||
body: body ? JSON.stringify(body) : undefined
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
let ready = false;
|
||||
for (let attempt = 0; attempt < 50; attempt += 1) {
|
||||
try {
|
||||
if ((await fetch(`http://127.0.0.1:${port}/healthz`)).ok) {
|
||||
ready = true;
|
||||
break;
|
||||
}
|
||||
} catch {}
|
||||
await new Promise((resolve) => setTimeout(resolve, 50));
|
||||
}
|
||||
assert.equal(ready, true, logs || "Key Vault did not start");
|
||||
|
||||
const providersResponse = await request("/v1/providers");
|
||||
assert.equal(providersResponse.status, 200);
|
||||
const providers = await providersResponse.json();
|
||||
assert.ok(providers.providers.some((provider) => provider.id === "openai"));
|
||||
assert.ok(providers.providers.some((provider) => provider.id === "ollama" && provider.credentialState === "local"));
|
||||
|
||||
const customResponse = await request("/v1/providers", {
|
||||
method: "POST",
|
||||
body: {
|
||||
id: "integration-provider",
|
||||
name: "Integration Provider",
|
||||
api: "openai-completions",
|
||||
connection: {type: "backend", baseUrl: "https://example.com/v1", proxy: null},
|
||||
auth: {type: "bearer"},
|
||||
defaultModel: "test-model",
|
||||
discovery: {type: "openai-models-list", url: "https://example.com/v1/models"}
|
||||
}
|
||||
});
|
||||
assert.equal(customResponse.status, 200);
|
||||
const savedCustom = await customResponse.json();
|
||||
assert.equal(savedCustom.provider.discovery.url, "https://example.com/v1/models");
|
||||
assert.equal("models" in savedCustom.provider, false);
|
||||
|
||||
const createdResponse = await request("/v1/credentials", {
|
||||
method: "POST",
|
||||
body: {providerId: "integration-provider", name: "default", secret: {provider: {apiKey: "provider-secret"}}}
|
||||
});
|
||||
assert.equal(createdResponse.status, 201);
|
||||
|
||||
const resolvedResponse = await request("/v1/resolve", {
|
||||
method: "POST",
|
||||
body: {providerId: "integration-provider", credentialName: "default"}
|
||||
});
|
||||
assert.equal(resolvedResponse.status, 200);
|
||||
const resolved = await resolvedResponse.json();
|
||||
assert.equal(resolved.provider.connection.baseUrl, "https://example.com/v1");
|
||||
assert.equal(resolved.credential.secret.provider.apiKey, "provider-secret");
|
||||
|
||||
const frontendCredential = await request("/v1/credentials", {
|
||||
method: "POST",
|
||||
body: {providerId: "ollama", name: "default", secret: "browser-only"}
|
||||
});
|
||||
assert.equal(frontendCredential.status, 409);
|
||||
console.log("Key Vault API tests passed");
|
||||
} finally {
|
||||
service.kill("SIGTERM");
|
||||
await new Promise((resolve) => service.once("exit", resolve));
|
||||
rmSync(directory, {recursive: true, force: true});
|
||||
}
|
||||
Reference in New Issue
Block a user