fix: complete diagnostic extension remediation
This commit is contained in:
@@ -50,6 +50,7 @@ export interface ConnectorDiagnosticRequest {
|
||||
user?: string;
|
||||
credentialFile?: string;
|
||||
tlsCaFile?: string;
|
||||
tlsServername?: string;
|
||||
resource: DiagnosticResource;
|
||||
timeoutMs: number;
|
||||
signal: AbortSignal;
|
||||
@@ -87,6 +88,7 @@ export interface VectorDiagnosticRequest {
|
||||
baseUrl?: string;
|
||||
credentialFile?: string;
|
||||
tlsCaFile?: string;
|
||||
tlsServername?: string;
|
||||
diagnostic?: RestDiagnosticRequest & {
|
||||
response: { collection: string; dimensions: string; distance: string };
|
||||
};
|
||||
@@ -147,7 +149,7 @@ export interface DatabaseDiagnosticClient {
|
||||
|
||||
export interface DatabaseDiagnosticClientFactory {
|
||||
connect(request: {
|
||||
host: string; port: number; database: string; user: string; credentialFile: string; tlsCaFile?: string; signal: AbortSignal;
|
||||
host: string; port: number; database: string; user: string; credentialFile: string; tlsCaFile?: string; tlsServername?: string; signal: AbortSignal;
|
||||
}): Promise<DatabaseDiagnosticClient>;
|
||||
}
|
||||
|
||||
@@ -298,13 +300,15 @@ export function createConcreteDiagnosticAdapters(
|
||||
},
|
||||
};
|
||||
const databaseClient = dependencies.databaseClient ?? {
|
||||
async connect(request: { host: string; port: number; database: string; user: string; credentialFile: string; tlsCaFile?: string; signal: AbortSignal }) {
|
||||
async connect(request: { host: string; port: number; database: string; user: string; credentialFile: string; tlsCaFile?: string; tlsServername?: string; signal: AbortSignal }) {
|
||||
const client = new Client({
|
||||
host: request.host, port: request.port, database: request.database, user: request.user,
|
||||
password: (await readFile(request.credentialFile, "utf8")).trim(),
|
||||
ssl: request.tlsCaFile
|
||||
? { ca: await readFile(request.tlsCaFile, "utf8"), rejectUnauthorized: true }
|
||||
: { rejectUnauthorized: true },
|
||||
ssl: {
|
||||
...(request.tlsCaFile ? { ca: await readFile(request.tlsCaFile, "utf8") } : {}),
|
||||
...(request.tlsServername ? { servername: request.tlsServername } : {}),
|
||||
rejectUnauthorized: true,
|
||||
},
|
||||
connectionTimeoutMillis: 5_000,
|
||||
});
|
||||
const abort = () => { void client.end(); };
|
||||
@@ -330,7 +334,8 @@ export function createConcreteDiagnosticAdapters(
|
||||
if (!database || !schema) throw new Error("direct probe failed");
|
||||
const client = await databaseClient.connect({
|
||||
host: request.host, port: request.port, database, user: request.user,
|
||||
credentialFile: request.credentialFile, tlsCaFile: request.tlsCaFile, signal: request.signal,
|
||||
credentialFile: request.credentialFile, tlsCaFile: request.tlsCaFile,
|
||||
tlsServername: request.tlsServername, signal: request.signal,
|
||||
});
|
||||
try {
|
||||
const result = await client.query("SELECT current_database() AS database, current_schema() AS schema", []);
|
||||
@@ -398,7 +403,8 @@ export function createConcreteDiagnosticAdapters(
|
||||
}
|
||||
const client = await databaseClient.connect({
|
||||
host: request.host, port: request.port, database: resource.database, user: request.user,
|
||||
credentialFile: request.credentialFile, tlsCaFile: request.tlsCaFile, signal: request.signal,
|
||||
credentialFile: request.credentialFile, tlsCaFile: request.tlsCaFile,
|
||||
tlsServername: request.tlsServername, signal: request.signal,
|
||||
});
|
||||
try {
|
||||
const metadata = await client.query(
|
||||
@@ -584,15 +590,14 @@ function connectorRequest(
|
||||
collection: workspace.semantic_index.vector_store.collection,
|
||||
};
|
||||
const field = (suffix: string) => bindingName(workspace, contractRole, suffix);
|
||||
const credentialFile = values[field(binding.transport === "rest_api" ? "API_KEY_FILE" : "PASSWORD_FILE")];
|
||||
if (credentialFile === undefined) return undefined;
|
||||
|
||||
if (binding.transport === "rest_api") {
|
||||
const baseUrl = values[field("BASE_URL")];
|
||||
const diagnostic = role === "dwh"
|
||||
? workspace.diagnostics?.dwh_rest
|
||||
: workspace.diagnostics?.vector_rest?.metadata;
|
||||
if (baseUrl === undefined || diagnostic === undefined) return undefined;
|
||||
const credentialFile = diagnostic.auth === "none" ? undefined : values[field("API_KEY_FILE")];
|
||||
if (diagnostic.auth !== "none" && credentialFile === undefined) return undefined;
|
||||
return {
|
||||
role,
|
||||
transport: "rest_api",
|
||||
@@ -621,6 +626,9 @@ function connectorRequest(
|
||||
};
|
||||
}
|
||||
|
||||
const credentialFile = values[field("PASSWORD_FILE")];
|
||||
if (credentialFile === undefined) return undefined;
|
||||
|
||||
const host = values[field("HOST")];
|
||||
const port = numericBinding(values, field("PORT"));
|
||||
const user = values[field("USER")];
|
||||
@@ -660,6 +668,7 @@ function tunnelProbeRequest(
|
||||
user,
|
||||
credentialFile: password,
|
||||
tlsCaFile: binding.values[bindingName(workspace, contractRole, "TLS_CA_FILE")],
|
||||
tlsServername: binding.values[bindingName(workspace, contractRole, "SSH_TARGET_HOST")],
|
||||
resource: role === "dwh"
|
||||
? { database: workspace.dwh.database, schema: workspace.dwh.schema }
|
||||
: {
|
||||
@@ -710,7 +719,8 @@ export function createWorkspaceDiagnoser(
|
||||
tunneledVectorMetadata = await adapters.inspectVector({
|
||||
transport: "ssh_tunnel", host: tunneledRequest.host, port: tunneledRequest.port,
|
||||
user: tunneledRequest.user, credentialFile: tunneledRequest.credentialFile,
|
||||
tlsCaFile: tunneledRequest.tlsCaFile, resource: tunneledRequest.resource,
|
||||
tlsCaFile: tunneledRequest.tlsCaFile, tlsServername: tunneledRequest.tlsServername,
|
||||
resource: tunneledRequest.resource,
|
||||
collection: canonical.semantic_index.vector_store.collection,
|
||||
dimensions: canonical.semantic_index.vector_store.dimensions,
|
||||
distance: canonical.semantic_index.vector_store.distance,
|
||||
|
||||
Reference in New Issue
Block a user