fix: verify PVC exists after creation in ensureAgentDbPvc

Before creating a PVC, ensureAgentDbPvc checks if it exists and creates
it if not. However, the Kubernetes API may return a Success response
without actually creating the resource. This commit adds a verification
step after createPvc to confirm the PVC actually exists before returning.

Fixes FAR-84.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 21:28:29 +00:00
parent 1de9b67fd3
commit 6accb424d4
5 changed files with 14 additions and 3 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.
Binary file not shown.
+5
View File
@@ -897,6 +897,11 @@ export async function ensureAgentDbPvc(
},
}, kubeconfigPath);
const verified = await getPvc(namespace, pvcName, kubeconfigPath);
if (!verified) {
throw new Error(`PVC ${pvcName} was not created in namespace ${namespace}`);
}
return pvcName;
}
+9 -3
View File
@@ -38,7 +38,9 @@ describe("ensureAgentDbPvc", () => {
});
it("creates PVC when it does not exist and returns the name", async () => {
vi.mocked(getPvc).mockResolvedValue(null);
vi.mocked(getPvc)
.mockResolvedValueOnce(null)
.mockResolvedValueOnce({ metadata: { name: `opencode-db-${AGENT_ID}` } } as never);
vi.mocked(createPvc).mockResolvedValue({} as never);
const result = await ensureAgentDbPvc(AGENT_ID, NAMESPACE, {
agentDbMode: "dedicated_pvc",
@@ -62,7 +64,9 @@ describe("ensureAgentDbPvc", () => {
});
it("defaults storage capacity to 1Gi when agentDbStorageCapacity is not set", async () => {
vi.mocked(getPvc).mockResolvedValue(null);
vi.mocked(getPvc)
.mockResolvedValueOnce(null)
.mockResolvedValueOnce({ metadata: { name: `opencode-db-${AGENT_ID}` } } as never);
vi.mocked(createPvc).mockResolvedValue({} as never);
await ensureAgentDbPvc(AGENT_ID, NAMESPACE, {
agentDbMode: "dedicated_pvc",
@@ -81,7 +85,9 @@ describe("ensureAgentDbPvc", () => {
it("sanitizes agent ID in PVC name (strips non-alphanumeric except hyphens)", async () => {
const weirdId = "Agent/ID:with@special!chars";
vi.mocked(getPvc).mockResolvedValue(null);
vi.mocked(getPvc)
.mockResolvedValueOnce(null)
.mockResolvedValueOnce({ metadata: { name: "opencode-db-agentidwithspecialchars" } } as never);
vi.mocked(createPvc).mockResolvedValue({} as never);
const result = await ensureAgentDbPvc(weirdId, NAMESPACE, {
agentDbMode: "dedicated_pvc",