- Implemented `MongoIndexModelTests` to verify index models for various stores. - Created `OpenApiMetadataFactory` with methods to generate OpenAPI metadata. - Added tests for `OpenApiMetadataFactory` to ensure expected defaults and URL overrides. - Introduced `ObserverSurfaceSecrets` and `WebhookSurfaceSecrets` for managing secrets. - Developed `RuntimeSurfaceFsClient` and `WebhookSurfaceFsClient` for manifest retrieval. - Added dependency injection tests for `SurfaceEnvironmentRegistration` in both Observer and Webhook contexts. - Implemented tests for secret resolution in `ObserverSurfaceSecretsTests` and `WebhookSurfaceSecretsTests`. - Created `EnsureLinkNotMergeCollectionsMigrationTests` to validate MongoDB migration logic. - Added project files for MongoDB tests and NuGet package mirroring.
126 lines
4.6 KiB
Plaintext
126 lines
4.6 KiB
Plaintext
// Task Runner baseline collections and indexes
|
|
// Mirrors docs/modules/taskrunner/migrations/pack-run-collections.md (last updated 2025-11-06)
|
|
|
|
function ensureCollection(name, validator) {
|
|
const existing = db.getCollectionNames();
|
|
if (!existing.includes(name)) {
|
|
db.createCollection(name, { validator, validationLevel: "moderate" });
|
|
} else if (validator) {
|
|
db.runCommand({ collMod: name, validator, validationLevel: "moderate" });
|
|
}
|
|
}
|
|
|
|
const runValidator = {
|
|
$jsonSchema: {
|
|
bsonType: "object",
|
|
required: ["planHash", "plan", "failurePolicy", "requestedAt", "createdAt", "updatedAt", "steps"],
|
|
properties: {
|
|
_id: { bsonType: "string" },
|
|
planHash: { bsonType: "string" },
|
|
plan: { bsonType: "object" },
|
|
failurePolicy: { bsonType: "object" },
|
|
requestedAt: { bsonType: "date" },
|
|
createdAt: { bsonType: "date" },
|
|
updatedAt: { bsonType: "date" },
|
|
steps: {
|
|
bsonType: "array",
|
|
items: {
|
|
bsonType: "object",
|
|
required: ["stepId", "status", "attempts"],
|
|
properties: {
|
|
stepId: { bsonType: "string" },
|
|
status: { bsonType: "string" },
|
|
attempts: { bsonType: "int" },
|
|
kind: { bsonType: "string" },
|
|
enabled: { bsonType: "bool" },
|
|
continueOnError: { bsonType: "bool" },
|
|
maxParallel: { bsonType: ["int", "null"] },
|
|
approvalId: { bsonType: ["string", "null"] },
|
|
gateMessage: { bsonType: ["string", "null"] },
|
|
lastTransitionAt: { bsonType: ["date", "null"] },
|
|
nextAttemptAt: { bsonType: ["date", "null"] },
|
|
statusReason: { bsonType: ["string", "null"] }
|
|
}
|
|
}
|
|
},
|
|
tenantId: { bsonType: ["string", "null"] }
|
|
}
|
|
}
|
|
};
|
|
|
|
const logValidator = {
|
|
$jsonSchema: {
|
|
bsonType: "object",
|
|
required: ["runId", "sequence", "timestamp", "level", "eventType", "message"],
|
|
properties: {
|
|
runId: { bsonType: "string" },
|
|
sequence: { bsonType: "long" },
|
|
timestamp: { bsonType: "date" },
|
|
level: { bsonType: "string" },
|
|
eventType: { bsonType: "string" },
|
|
message: { bsonType: "string" },
|
|
stepId: { bsonType: ["string", "null"] },
|
|
metadata: { bsonType: ["object", "null"] }
|
|
}
|
|
}
|
|
};
|
|
|
|
const artifactsValidator = {
|
|
$jsonSchema: {
|
|
bsonType: "object",
|
|
required: ["runId", "name", "type", "status", "capturedAt"],
|
|
properties: {
|
|
runId: { bsonType: "string" },
|
|
name: { bsonType: "string" },
|
|
type: { bsonType: "string" },
|
|
status: { bsonType: "string" },
|
|
capturedAt: { bsonType: "date" },
|
|
sourcePath: { bsonType: ["string", "null"] },
|
|
storedPath: { bsonType: ["string", "null"] },
|
|
notes: { bsonType: ["string", "null"] },
|
|
expression: { bsonType: ["object", "null"] }
|
|
}
|
|
}
|
|
};
|
|
|
|
const approvalsValidator = {
|
|
$jsonSchema: {
|
|
bsonType: "object",
|
|
required: ["runId", "approvalId", "requestedAt", "status"],
|
|
properties: {
|
|
runId: { bsonType: "string" },
|
|
approvalId: { bsonType: "string" },
|
|
requiredGrants: { bsonType: "array", items: { bsonType: "string" } },
|
|
stepIds: { bsonType: "array", items: { bsonType: "string" } },
|
|
messages: { bsonType: "array", items: { bsonType: "string" } },
|
|
reasonTemplate: { bsonType: ["string", "null"] },
|
|
requestedAt: { bsonType: "date" },
|
|
status: { bsonType: "string" },
|
|
actorId: { bsonType: ["string", "null"] },
|
|
completedAt: { bsonType: ["date", "null"] },
|
|
summary: { bsonType: ["string", "null"] }
|
|
}
|
|
}
|
|
};
|
|
|
|
ensureCollection("pack_runs", runValidator);
|
|
ensureCollection("pack_run_logs", logValidator);
|
|
ensureCollection("pack_artifacts", artifactsValidator);
|
|
ensureCollection("pack_run_approvals", approvalsValidator);
|
|
|
|
// Indexes for pack_runs
|
|
db.pack_runs.createIndex({ updatedAt: -1 }, { name: "pack_runs_updatedAt_desc" });
|
|
db.pack_runs.createIndex({ tenantId: 1, updatedAt: -1 }, { name: "pack_runs_tenant_updatedAt_desc", sparse: true });
|
|
|
|
// Indexes for pack_run_logs
|
|
db.pack_run_logs.createIndex({ runId: 1, sequence: 1 }, { unique: true, name: "pack_run_logs_run_sequence" });
|
|
db.pack_run_logs.createIndex({ runId: 1, timestamp: 1 }, { name: "pack_run_logs_run_timestamp" });
|
|
|
|
// Indexes for pack_artifacts
|
|
db.pack_artifacts.createIndex({ runId: 1, name: 1 }, { unique: true, name: "pack_artifacts_run_name" });
|
|
db.pack_artifacts.createIndex({ runId: 1 }, { name: "pack_artifacts_run" });
|
|
|
|
// Indexes for pack_run_approvals
|
|
db.pack_run_approvals.createIndex({ runId: 1, approvalId: 1 }, { unique: true, name: "pack_run_approvals_run_approval" });
|
|
db.pack_run_approvals.createIndex({ runId: 1, status: 1 }, { name: "pack_run_approvals_run_status" });
|