@calltelemetry/ct-lab-mcp 0.8.91 → 0.8.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -20
- package/dist/src/hypervisors/manager.d.ts.map +1 -1
- package/dist/src/hypervisors/manager.js +11 -11
- package/dist/src/hypervisors/manager.js.map +1 -1
- package/dist/src/hypervisors/types.d.ts +3 -0
- package/dist/src/hypervisors/types.d.ts.map +1 -1
- package/dist/src/server.js +4 -4
- package/dist/src/server.js.map +1 -1
- package/dist/src/slot/manager.d.ts.map +1 -1
- package/dist/src/slot/manager.js +29 -34
- package/dist/src/slot/manager.js.map +1 -1
- package/dist/src/tools/appliance-claim-tools.d.ts.map +1 -1
- package/dist/src/tools/appliance-claim-tools.js +12 -10
- package/dist/src/tools/appliance-claim-tools.js.map +1 -1
- package/dist/src/tools/auto-host-placement.d.ts +33 -0
- package/dist/src/tools/auto-host-placement.d.ts.map +1 -0
- package/dist/src/tools/auto-host-placement.js +39 -0
- package/dist/src/tools/auto-host-placement.js.map +1 -0
- package/dist/src/tools/claim-creation-projection.js +2 -2
- package/dist/src/tools/claim-creation-projection.js.map +1 -1
- package/dist/src/tools/claim-custody.d.ts +175 -0
- package/dist/src/tools/claim-custody.d.ts.map +1 -0
- package/dist/src/tools/claim-custody.js +196 -0
- package/dist/src/tools/claim-custody.js.map +1 -0
- package/dist/src/tools/claim-kubernetes.d.ts +14 -0
- package/dist/src/tools/claim-kubernetes.d.ts.map +1 -0
- package/dist/src/tools/{slot-kubernetes.js → claim-kubernetes.js} +30 -26
- package/dist/src/tools/claim-kubernetes.js.map +1 -0
- package/dist/src/tools/fleet-metrics.d.ts +37 -2
- package/dist/src/tools/fleet-metrics.d.ts.map +1 -1
- package/dist/src/tools/fleet-metrics.js +25 -15
- package/dist/src/tools/fleet-metrics.js.map +1 -1
- package/dist/src/tools/host-capacity-rank.d.ts +25 -0
- package/dist/src/tools/host-capacity-rank.d.ts.map +1 -0
- package/dist/src/tools/host-capacity-rank.js +17 -0
- package/dist/src/tools/host-capacity-rank.js.map +1 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +20 -19
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/kubernetes-backend.js +1 -1
- package/dist/src/tools/kubernetes-backend.js.map +1 -1
- package/dist/src/tools/legacy-clone-plan.d.ts +2 -0
- package/dist/src/tools/legacy-clone-plan.d.ts.map +1 -1
- package/dist/src/tools/legacy-clone-plan.js +13 -5
- package/dist/src/tools/legacy-clone-plan.js.map +1 -1
- package/dist/src/tools/legacy-guest-guard.d.ts.map +1 -1
- package/dist/src/tools/legacy-guest-guard.js +4 -2
- package/dist/src/tools/legacy-guest-guard.js.map +1 -1
- package/dist/src/tools/{physical-slot.d.ts → legacy-reservation.d.ts} +79 -40
- package/dist/src/tools/legacy-reservation.d.ts.map +1 -0
- package/dist/src/tools/legacy-reservation.js +111 -0
- package/dist/src/tools/legacy-reservation.js.map +1 -0
- package/dist/src/tools/provision-tools.d.ts.map +1 -1
- package/dist/src/tools/provision-tools.js +16 -4
- package/dist/src/tools/provision-tools.js.map +1 -1
- package/dist/src/tools/quick-provision.d.ts.map +1 -1
- package/dist/src/tools/quick-provision.js +15 -4
- package/dist/src/tools/quick-provision.js.map +1 -1
- package/dist/src/tools/renewal-claim.d.ts +2 -1
- package/dist/src/tools/renewal-claim.d.ts.map +1 -1
- package/dist/src/tools/renewal-claim.js +19 -8
- package/dist/src/tools/renewal-claim.js.map +1 -1
- package/dist/src/tools/slot-retirement.d.ts +22 -0
- package/dist/src/tools/slot-retirement.d.ts.map +1 -0
- package/dist/src/tools/slot-retirement.js +42 -0
- package/dist/src/tools/slot-retirement.js.map +1 -0
- package/package.json +2 -2
- package/dist/src/tools/physical-slot.d.ts.map +0 -1
- package/dist/src/tools/physical-slot.js +0 -319
- package/dist/src/tools/physical-slot.js.map +0 -1
- package/dist/src/tools/slot-kubernetes.d.ts +0 -14
- package/dist/src/tools/slot-kubernetes.d.ts.map +0 -1
- package/dist/src/tools/slot-kubernetes.js.map +0 -1
- /package/dist/src/tools/{physical-slot-claim-spec-schema.v1.json → appliance-claim-spec-schema.v1.json} +0 -0
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* guest's managed-claim block) and the ApplianceClaim the appliance operator expires on
|
|
6
6
|
* (`status.completionTime + spec.ttlHours`). `vm_renew` used to extend only the lease, so the operator
|
|
7
7
|
* destroyed a guest that still held a live lease. `vm_renew` now extends the ApplianceClaim FIRST (CAS patch,
|
|
8
|
-
* read-back), checks the
|
|
8
|
+
* read-back), checks the claim custody record (or legacy reservation Lease, read-only) is still bound to it, runs the canonical renewal, and puts
|
|
9
9
|
* the claim back if the canonical renewal fails. Any failure fails the renew: no partial renewals.
|
|
10
10
|
*/
|
|
11
|
-
import {
|
|
11
|
+
import { claimCustody } from "./claim-custody.js";
|
|
12
|
+
import { claimGuest, legacyReservationLeaseName } from "./legacy-reservation.js";
|
|
12
13
|
import { queryKubernetesApi } from "./appliance-claim-tools.js";
|
|
13
14
|
import { KubernetesCommandError, runLabKubectl } from "./kubernetes-backend.js";
|
|
14
15
|
const NS = "ct-lab";
|
|
@@ -75,8 +76,18 @@ export function requiredTtlHours(claim, leaseExpiryMs, nowMs) {
|
|
|
75
76
|
return Math.max(current, Math.ceil((leaseExpiryMs - baseline) / 3_600_000));
|
|
76
77
|
}
|
|
77
78
|
async function reservationFor(client, claim) {
|
|
78
|
-
const
|
|
79
|
-
const
|
|
79
|
+
const guest = claimGuest(claim);
|
|
80
|
+
const held = claimCustody(claim);
|
|
81
|
+
if (held) {
|
|
82
|
+
if (held.phase !== "bound" && held.phase !== "provider-bound") {
|
|
83
|
+
throw new Error(`claim custody is '${held.phase}'; the claim is being retired and cannot be renewed`);
|
|
84
|
+
}
|
|
85
|
+
if (JSON.stringify(held.guest) !== JSON.stringify(guest))
|
|
86
|
+
throw new Error("claim custody names a different guest than the claim spec");
|
|
87
|
+
return { status: "bound", phase: held.phase, name: claim.metadata.name, source: "annotation" };
|
|
88
|
+
}
|
|
89
|
+
// Legacy claim: the operator migrates the Lease into the annotation; we only read it.
|
|
90
|
+
const name = legacyReservationLeaseName(guest);
|
|
80
91
|
const lease = await client.getLease(name);
|
|
81
92
|
if (!lease)
|
|
82
93
|
return { status: "absent", name };
|
|
@@ -85,14 +96,14 @@ async function reservationFor(client, claim) {
|
|
|
85
96
|
record = JSON.parse(lease.metadata?.annotations?.["calltelemetry.com/physical-slot"] ?? "{}");
|
|
86
97
|
}
|
|
87
98
|
catch {
|
|
88
|
-
throw new Error("physical-slot reservation payload is unreadable");
|
|
99
|
+
throw new Error("legacy physical-slot reservation payload is unreadable");
|
|
89
100
|
}
|
|
90
101
|
if (record.phase !== "bound" && record.phase !== "provider-bound") {
|
|
91
|
-
throw new Error(`physical-slot reservation is '${record.phase}'; the claim is being retired and cannot be renewed`);
|
|
102
|
+
throw new Error(`legacy physical-slot reservation is '${record.phase}'; the claim is being retired and cannot be renewed`);
|
|
92
103
|
}
|
|
93
104
|
if (record.claim?.uid !== claim.metadata?.uid)
|
|
94
|
-
throw new Error("physical-slot reservation is bound to a different claim UID");
|
|
95
|
-
return { status: "bound", phase: record.phase, name };
|
|
105
|
+
throw new Error("legacy physical-slot reservation is bound to a different claim UID");
|
|
106
|
+
return { status: "bound", phase: record.phase, name, source: "legacy-lease" };
|
|
96
107
|
}
|
|
97
108
|
/** Finds the ApplianceClaim for a canonical asset (its VM name). Throws unless exactly one live claim names it. */
|
|
98
109
|
export async function findClaimForAsset(client, assetId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal-claim.js","sourceRoot":"","sources":["../../../src/tools/renewal-claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"renewal-claim.js","sourceRoot":"","sources":["../../../src/tools/renewal-claim.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slot retirement (REL-1746): lab capacity is pure cluster capacity, not slot counts or reservation Leases.
|
|
3
|
+
*
|
|
4
|
+
* The slot verbs survive only as compatibility surface. Verbs with a capacity-based equivalent become
|
|
5
|
+
* deprecated aliases (the real result plus `deprecated: true` and the replacement). Verbs with no capacity
|
|
6
|
+
* equivalent return an explicit, non-internal "retired" error.
|
|
7
|
+
*/
|
|
8
|
+
import { CallToolResult } from "../types/mcp.js";
|
|
9
|
+
export declare const SLOT_RETIREMENT_ADR = "slot retirement ADR (REL-1746)";
|
|
10
|
+
export declare const SLOT_VERB_RETIRED_CODE = "SLOT_VERB_RETIRED";
|
|
11
|
+
export interface SlotVerbNotice {
|
|
12
|
+
replacement: string[];
|
|
13
|
+
note: string;
|
|
14
|
+
}
|
|
15
|
+
/** Replacement tool names are the real registered tool names. */
|
|
16
|
+
export declare const DEPRECATED_SLOT_VERBS: Record<string, SlotVerbNotice>;
|
|
17
|
+
export declare const RETIRED_SLOT_VERBS: Record<string, SlotVerbNotice>;
|
|
18
|
+
/** Adds `deprecated: true` plus the replacement to a real result without altering its existing content. */
|
|
19
|
+
export declare function withSlotDeprecation(tool: string, result: CallToolResult): CallToolResult;
|
|
20
|
+
/** Explicit "retired" error. Deliberately not UPSTREAM_API_ERROR: nothing failed, the verb no longer exists. */
|
|
21
|
+
export declare function retiredSlotVerbResult(tool: string): CallToolResult;
|
|
22
|
+
//# sourceMappingURL=slot-retirement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-retirement.d.ts","sourceRoot":"","sources":["../../../src/tools/slot-retirement.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAyB,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,mBAAmB,mCAAmC,CAAC;AACpE,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAAG,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACvE,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAKhE,CAAC;AACF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAG7D,CAAC;AAEF,2GAA2G;AAC3G,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,cAAc,CAUxF;AAED,gHAAgH;AAChH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CASlE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slot retirement (REL-1746): lab capacity is pure cluster capacity, not slot counts or reservation Leases.
|
|
3
|
+
*
|
|
4
|
+
* The slot verbs survive only as compatibility surface. Verbs with a capacity-based equivalent become
|
|
5
|
+
* deprecated aliases (the real result plus `deprecated: true` and the replacement). Verbs with no capacity
|
|
6
|
+
* equivalent return an explicit, non-internal "retired" error.
|
|
7
|
+
*/
|
|
8
|
+
import { createToolErrorResult } from "../types/mcp.js";
|
|
9
|
+
export const SLOT_RETIREMENT_ADR = "slot retirement ADR (REL-1746)";
|
|
10
|
+
export const SLOT_VERB_RETIRED_CODE = "SLOT_VERB_RETIRED";
|
|
11
|
+
/** Replacement tool names are the real registered tool names. */
|
|
12
|
+
export const DEPRECATED_SLOT_VERBS = {
|
|
13
|
+
find_slot: { replacement: ["list_hosts"], note: "Hosts are ranked by live free RAM then free disk headroom; list_hosts reports the same capacity (slot counts are deprecated estimates)." },
|
|
14
|
+
claim_slot: { replacement: ["create_appliance_claim", "auto_provision_vm"], note: "Capacity is admitted from real host RAM/CPU/disk, not slots; claim the exact guest with create_appliance_claim." },
|
|
15
|
+
release_slot: { replacement: ["delete_appliance_claim"], note: "Release by deleting the ApplianceClaim (expectedUid required); the operator reaps and frees the capacity." },
|
|
16
|
+
list_slots: { replacement: ["list_appliance_claims", "list_hosts"], note: "Claims are the occupancy record; list_hosts reports free RAM/CPU/disk capacity." },
|
|
17
|
+
};
|
|
18
|
+
export const RETIRED_SLOT_VERBS = {
|
|
19
|
+
purge_slots: { replacement: ["list_expired_vms", "cleanup_expired_vms"], note: "The operator's strict reaper deletes expired claims and destroys unclaimed guests; classify and clean up explicitly with list_expired_vms / cleanup_expired_vms." },
|
|
20
|
+
pin_pool_slots: { replacement: [], note: "There are no pool slots. Pass webImage to proxmox_quick_provision, which pins the image at provision time." },
|
|
21
|
+
};
|
|
22
|
+
/** Adds `deprecated: true` plus the replacement to a real result without altering its existing content. */
|
|
23
|
+
export function withSlotDeprecation(tool, result) {
|
|
24
|
+
const notice = DEPRECATED_SLOT_VERBS[tool];
|
|
25
|
+
if (!notice)
|
|
26
|
+
return result;
|
|
27
|
+
const deprecation = { tool, replacement: notice.replacement, adr: SLOT_RETIREMENT_ADR, note: notice.note };
|
|
28
|
+
const text = `DEPRECATED: ${tool} is retired by the ${SLOT_RETIREMENT_ADR}; use ${notice.replacement.join(" or ")}. ${notice.note}`;
|
|
29
|
+
return {
|
|
30
|
+
...result,
|
|
31
|
+
content: [...(result.content ?? []), { type: "text", text }],
|
|
32
|
+
structuredContent: { ...(result.structuredContent ?? {}), deprecated: true, deprecation },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Explicit "retired" error. Deliberately not UPSTREAM_API_ERROR: nothing failed, the verb no longer exists. */
|
|
36
|
+
export function retiredSlotVerbResult(tool) {
|
|
37
|
+
const notice = RETIRED_SLOT_VERBS[tool];
|
|
38
|
+
const use = notice.replacement.length ? ` Use ${notice.replacement.join(" or ")} instead.` : "";
|
|
39
|
+
const result = createToolErrorResult(SLOT_VERB_RETIRED_CODE, `${tool} is retired by the ${SLOT_RETIREMENT_ADR}; lab capacity is real host capacity, not slots.${use} ${notice.note} No action was taken.`, { retired: true, tool, replacement: notice.replacement, adr: SLOT_RETIREMENT_ADR });
|
|
40
|
+
return { ...result, structuredContent: { ...(result.structuredContent ?? {}), retired: true } };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=slot-retirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slot-retirement.js","sourceRoot":"","sources":["../../../src/tools/slot-retirement.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAkB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,gCAAgC,CAAC;AACpE,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAG1D,iEAAiE;AACjE,MAAM,CAAC,MAAM,qBAAqB,GAAmC;IACnE,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,yIAAyI,EAAE;IAC3L,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,CAAC,EAAE,IAAI,EAAE,iHAAiH,EAAE;IACrM,YAAY,EAAE,EAAE,WAAW,EAAE,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE,2GAA2G,EAAE;IAC5K,UAAU,EAAE,EAAE,WAAW,EAAE,CAAC,uBAAuB,EAAE,YAAY,CAAC,EAAE,IAAI,EAAE,iFAAiF,EAAE;CAC9J,CAAC;AACF,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAE,kKAAkK,EAAE;IACnP,cAAc,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,4GAA4G,EAAE;CACxJ,CAAC;AAEF,2GAA2G;AAC3G,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,MAAsB;IACtE,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3B,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3G,MAAM,IAAI,GAAG,eAAe,IAAI,sBAAsB,mBAAmB,SAAS,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;IACpI,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC5D,iBAAiB,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;KAC1F,CAAC;AACJ,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,MAAM,GAAG,qBAAqB,CAClC,sBAAsB,EACtB,GAAG,IAAI,sBAAsB,mBAAmB,mDAAmD,GAAG,IAAI,MAAM,CAAC,IAAI,uBAAuB,EAC5I,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,mBAAmB,EAAE,CACnF,CAAC;IACF,OAAO,EAAE,GAAG,MAAM,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AAClG,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calltelemetry/ct-lab-mcp",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.93",
|
|
4
4
|
"description": "Expanded Model Context Protocol (MCP) server for Call Telemetry lab, fleet, and appliance management across Proxmox VE and VMware ESXi.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"LICENSE"
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "NODE_OPTIONS='--max-old-space-size=8192' tsc -p tsconfig.build.json && node tools/copy-
|
|
18
|
+
"build": "NODE_OPTIONS='--max-old-space-size=8192' tsc -p tsconfig.build.json && node tools/copy-claim-spec-schema.mjs && chmod +x dist/bin/*.js",
|
|
19
19
|
"typecheck": "NODE_OPTIONS='--max-old-space-size=8192' tsc --noEmit",
|
|
20
20
|
"pretest": "npm run build",
|
|
21
21
|
"test": "vitest run",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"physical-slot.d.ts","sourceRoot":"","sources":["../../../src/tools/physical-slot.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGnE,eAAO,MAAM,eAAe,oCAAoC,CAAC;AACjE,eAAO,MAAM,UAAU,oDAAoD,CAAC;AAC5E,eAAO,MAAM,YAAY,mDAAmD,CAAC;AAO7E,QAAA,MAAM,UAAU;;;;;;;;;;;;EAA2G,CAAC;AAC5H,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAOtD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAK5D;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aACjB,SAAS,EAAE,MAAM;aAAkB,IAAI,EAAE,YAAY;gBAArD,SAAS,EAAE,MAAM,EAAkB,IAAI,EAAE,YAAY;CAIlF;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAIhD;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAE1F;AACD,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAIvF;AACD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAG5D;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,GAAG,GAAG,YAAY,CAQ1D;AAiDD,2FAA2F;AAC3F,MAAM,WAAW,QAAQ;IAAG,GAAG,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,MAAM,CAAC;CAAE;AAyFnF,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,WAAa,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAmDtI;AACD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,WAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAuB5G"}
|
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
/** Shared physical-slot authority (REL-1564). Durable records never expire or auto-clear. */
|
|
2
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
import { load as yamlLoad, JSON_SCHEMA } from "js-yaml";
|
|
5
|
-
import { actualClaimIssue, claimCreationSha256, effectiveClaimSpec } from "./claim-creation-projection.js";
|
|
6
|
-
import { createSlotApi } from "./slot-kubernetes.js";
|
|
7
|
-
import { CLAIM_NODE_TO_PROXMOX_HOST } from "./proxmox-host-policy.js";
|
|
8
|
-
export const SLOT_ANNOTATION = "calltelemetry.com/physical-slot";
|
|
9
|
-
export const SLOT_NONCE = "calltelemetry.com/physical-slot-operation-nonce";
|
|
10
|
-
export const SLOT_REQUEST = "calltelemetry.com/physical-slot-request-sha256";
|
|
11
|
-
const LEASES = "/apis/coordination.k8s.io/v1/namespaces/ct-lab/leases";
|
|
12
|
-
const CLAIMS = "/apis/calltelemetry.com/v1alpha1/namespaces/ct-lab/applianceclaims";
|
|
13
|
-
const printable = z.string().min(1).max(256).regex(/^[\x20-\x7e]+$/);
|
|
14
|
-
const uuid = z.string().uuid().refine(value => value === value.toLowerCase(), "UUID must be canonical lowercase");
|
|
15
|
-
const sha = z.string().regex(/^[0-9a-f]{64}$/);
|
|
16
|
-
const objectName = z.string().min(1).max(253).refine(name => name.split(".").every(label => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(label)), "DNS subdomain labels must be nonempty and at most63 characters");
|
|
17
|
-
const SlotSchema = z.object({ hostAssetId: printable, node: printable, vmid: z.number().safe().int().positive() }).strict();
|
|
18
|
-
const ClaimIdentitySchema = z.object({ namespace: z.literal("ct-lab"), name: objectName, uid: uuid }).strict();
|
|
19
|
-
const ContextSchema = z.discriminatedUnion("kind", [
|
|
20
|
-
z.object({ kind: z.literal("mcp"), issueKey: printable.optional() }).strict(),
|
|
21
|
-
z.object({ kind: z.literal("operator"), issueKey: printable.optional() }).strict(),
|
|
22
|
-
z.object({ kind: z.literal("ct-meta"), logicalAssetId: printable, issueKey: printable, importOperationId: printable }).strict(),
|
|
23
|
-
]);
|
|
24
|
-
export const ReservationSchema = z.object({
|
|
25
|
-
schema: z.literal("physical-slot-reservation/v1"), slot: SlotSchema,
|
|
26
|
-
phase: z.enum(["provisional", "bound", "provider-bound", "retiring", "released"]),
|
|
27
|
-
operationNonce: uuid, requestSha256: sha,
|
|
28
|
-
intendedClaim: z.object({ namespace: z.literal("ct-lab"), name: objectName }).strict(), context: ContextSchema,
|
|
29
|
-
claim: ClaimIdentitySchema.nullable(),
|
|
30
|
-
provider: z.object({ uuid, vmName: printable, managedOwnershipSha256: sha, volumes: z.array(z.string().min(1).max(512).regex(/^[\x20-\x7e]+$/)).max(256) }).strict().nullable(),
|
|
31
|
-
}).strict();
|
|
32
|
-
const MutexSchema = z.object({ schema: z.literal("physical-slot-mutex/v1"), slot: SlotSchema, ownerNonce: uuid, token: uuid }).strict();
|
|
33
|
-
function requireSlot(ok, message) {
|
|
34
|
-
if (!ok)
|
|
35
|
-
throw new Error(`physical slot ${message}; retain reservation`);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* A claim with no reservation Lease at all was created outside the guarded
|
|
39
|
-
* create path (before the reservation protocol, or by a direct apply). There is
|
|
40
|
-
* no original-owner record to retire it against, so the guard refuses. This is
|
|
41
|
-
* deliberately distinct from a Lease that exists but fails identity/CAS checks:
|
|
42
|
-
* reporting both as "Lease identity or CAS version differs" sent operators
|
|
43
|
-
* hunting a stale version when the real fact is that nothing was ever reserved.
|
|
44
|
-
*/
|
|
45
|
-
export class UnreservedClaimError extends Error {
|
|
46
|
-
claimName;
|
|
47
|
-
slot;
|
|
48
|
-
constructor(claimName, slot) {
|
|
49
|
-
super(`ApplianceClaim '${claimName}' has no physical-slot reservation Lease for ${slot.node}/${slot.vmid}: it was created outside the guarded create path, so the guard has no original-owner record to retire it against; nothing was modified`);
|
|
50
|
-
this.claimName = claimName;
|
|
51
|
-
this.slot = slot;
|
|
52
|
-
this.name = "UnreservedClaimError";
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export function canonicalJson(value) {
|
|
56
|
-
if (Array.isArray(value))
|
|
57
|
-
return `[${value.map(canonicalJson).join(",")}]`;
|
|
58
|
-
if (value !== null && typeof value === "object")
|
|
59
|
-
return `{${Object.keys(value).sort().map(k => `${JSON.stringify(k)}:${canonicalJson(value[k])}`).join(",")}}`;
|
|
60
|
-
return JSON.stringify(value);
|
|
61
|
-
}
|
|
62
|
-
const digest = (value) => createHash("sha256").update(canonicalJson(value), "utf8").digest("hex");
|
|
63
|
-
export function physicalSlot(hostAssetId, node, vmid) {
|
|
64
|
-
return SlotSchema.parse({ hostAssetId, node, vmid });
|
|
65
|
-
}
|
|
66
|
-
export function slotLeaseName(role, slot) {
|
|
67
|
-
SlotSchema.parse(slot);
|
|
68
|
-
const hash = digest([slot.hostAssetId, slot.node, slot.vmid]);
|
|
69
|
-
return `ct-physical-slot-${role}.${hash.slice(0, 32)}.${hash.slice(32)}`;
|
|
70
|
-
}
|
|
71
|
-
export function creationOwnerSha(record) {
|
|
72
|
-
const { schema, slot, operationNonce, requestSha256, intendedClaim, context } = ReservationSchema.parse(record);
|
|
73
|
-
return digest({ schema, slot, operationNonce, requestSha256, intendedClaim, context });
|
|
74
|
-
}
|
|
75
|
-
export function claimPhysicalSlot(claim) {
|
|
76
|
-
const node = claim?.spec?.node;
|
|
77
|
-
const hostAssetId = typeof node === "string" && Object.hasOwn(CLAIM_NODE_TO_PROXMOX_HOST, node)
|
|
78
|
-
? CLAIM_NODE_TO_PROXMOX_HOST[node]
|
|
79
|
-
: undefined;
|
|
80
|
-
requireSlot(hostAssetId, "requires a canonical Proxmox claim node");
|
|
81
|
-
requireSlot(Number.isSafeInteger(claim.spec.vmid) && claim.spec.vmid >= 100 && claim.spec.vmid <= 8999, "requires an explicit provider VMID");
|
|
82
|
-
return physicalSlot(hostAssetId, node, claim.spec.vmid);
|
|
83
|
-
}
|
|
84
|
-
function leaseEnvelope(lease, name) {
|
|
85
|
-
requireSlot(lease?.apiVersion === "coordination.k8s.io/v1" && lease.kind === "Lease"
|
|
86
|
-
&& lease.metadata?.namespace === "ct-lab" && lease.metadata.name === name
|
|
87
|
-
&& uuid.safeParse(lease.metadata.uid).success && typeof lease.metadata.resourceVersion === "string"
|
|
88
|
-
&& lease.metadata.resourceVersion.length > 0 && !lease.metadata.deletionTimestamp, "Lease identity or CAS version differs");
|
|
89
|
-
}
|
|
90
|
-
function annotationJson(text) {
|
|
91
|
-
requireSlot(typeof text === "string" && Buffer.byteLength(text) <= 65_536, "annotation JSON unavailable or oversized");
|
|
92
|
-
const value = JSON.parse(text); // Accept only JSON syntax, not YAML extensions.
|
|
93
|
-
yamlLoad(text, { schema: JSON_SCHEMA, json: false }); // Reject duplicate/escaped duplicate keys.
|
|
94
|
-
return value;
|
|
95
|
-
}
|
|
96
|
-
function reservation(lease, slot) {
|
|
97
|
-
leaseEnvelope(lease, slotLeaseName("reservation", slot));
|
|
98
|
-
const record = ReservationSchema.parse(annotationJson(lease.metadata.annotations?.[SLOT_ANNOTATION]));
|
|
99
|
-
requireSlot(canonicalJson(record.slot) === canonicalJson(slot), "stored full tuple differs");
|
|
100
|
-
requireSlot(lease.spec && Object.keys(lease.spec).length === 0, "durable reservation has expiring lease semantics");
|
|
101
|
-
requireSlot(record.phase === "provisional" ? record.claim === null && record.provider === null : record.claim !== null, "phase and claim binding differ");
|
|
102
|
-
if (record.claim)
|
|
103
|
-
requireSlot(record.claim.namespace === record.intendedClaim.namespace && record.claim.name === record.intendedClaim.name, "bound claim differs from original intent");
|
|
104
|
-
if (record.provider)
|
|
105
|
-
requireSlot(canonicalJson(record.provider.volumes) === canonicalJson([...new Set(record.provider.volumes)].sort()), "provider volumes are not sorted and unique");
|
|
106
|
-
requireSlot(record.phase !== "provider-bound" || record.provider !== null, "provider phase lacks immutable provider binding");
|
|
107
|
-
return record;
|
|
108
|
-
}
|
|
109
|
-
function verifyClaim(live, record, expectedUid) {
|
|
110
|
-
requireSlot(live?.apiVersion === "calltelemetry.com/v1alpha1" && live.kind === "ApplianceClaim"
|
|
111
|
-
&& live.metadata?.namespace === record.intendedClaim.namespace && live.metadata.name === record.intendedClaim.name
|
|
112
|
-
&& uuid.safeParse(live.metadata.uid).success && (!expectedUid || live.metadata.uid === expectedUid)
|
|
113
|
-
&& typeof live.metadata.resourceVersion === "string" && live.metadata.resourceVersion.length > 0
|
|
114
|
-
&& canonicalJson(claimPhysicalSlot(live)) === canonicalJson(record.slot)
|
|
115
|
-
&& live.metadata.annotations?.[SLOT_NONCE] === record.operationNonce
|
|
116
|
-
&& live.metadata.annotations?.[SLOT_REQUEST] === record.requestSha256
|
|
117
|
-
&& (actualClaimIssue(live) ?? null) === (record.context.issueKey ?? null)
|
|
118
|
-
&& claimCreationSha256(live) === record.requestSha256, "independent claim UID, tuple or source lineage differs");
|
|
119
|
-
}
|
|
120
|
-
const MUTEX_FIELDS = ["holderIdentity", "leaseDurationSeconds", "acquireTime", "renewTime", "leaseTransitions"].sort();
|
|
121
|
-
function wireTime(milliseconds) { return new Date(milliseconds).toISOString().replace(/Z$/, "000Z"); }
|
|
122
|
-
function timeValue(value) {
|
|
123
|
-
requireSlot(typeof value === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{6}Z$/.test(value), "mutex timestamp is not canonical UTC microseconds");
|
|
124
|
-
const parsed = Date.parse(value);
|
|
125
|
-
requireSlot(Number.isFinite(parsed) && new Date(parsed).toISOString() === value.slice(0, 23) + "Z", "mutex timestamp is invalid");
|
|
126
|
-
return parsed;
|
|
127
|
-
}
|
|
128
|
-
function leaseBody(name, record, existing, spec = {}) {
|
|
129
|
-
return { apiVersion: "coordination.k8s.io/v1", kind: "Lease", metadata: {
|
|
130
|
-
...(existing?.metadata || {}), name, namespace: "ct-lab",
|
|
131
|
-
annotations: { ...(existing?.metadata?.annotations || {}), [SLOT_ANNOTATION]: canonicalJson(record) },
|
|
132
|
-
}, spec };
|
|
133
|
-
}
|
|
134
|
-
const defaults = () => ({ api: createSlotApi(), now: Date.now, nonce: randomUUID });
|
|
135
|
-
class Mutex {
|
|
136
|
-
deps;
|
|
137
|
-
slot;
|
|
138
|
-
lease;
|
|
139
|
-
owner;
|
|
140
|
-
timer;
|
|
141
|
-
tail = Promise.resolve();
|
|
142
|
-
failure;
|
|
143
|
-
constructor(deps, slot) {
|
|
144
|
-
this.deps = deps;
|
|
145
|
-
this.slot = slot;
|
|
146
|
-
this.owner = MutexSchema.parse({ schema: "physical-slot-mutex/v1", slot, ownerNonce: deps.nonce(), token: deps.nonce() });
|
|
147
|
-
}
|
|
148
|
-
name() { return slotLeaseName("mutex", this.slot); }
|
|
149
|
-
queue(fn) {
|
|
150
|
-
const run = this.tail.then(fn);
|
|
151
|
-
this.tail = run.catch(() => { });
|
|
152
|
-
return run;
|
|
153
|
-
}
|
|
154
|
-
validate(value) {
|
|
155
|
-
leaseEnvelope(value, this.name());
|
|
156
|
-
const wire = MutexSchema.parse(annotationJson(value.metadata.annotations?.[SLOT_ANNOTATION]));
|
|
157
|
-
requireSlot(canonicalJson(wire.slot) === canonicalJson(this.slot) && value.spec?.holderIdentity === wire.token
|
|
158
|
-
&& value.spec.leaseDurationSeconds === 120 && Number.isSafeInteger(value.spec.leaseTransitions) && value.spec.leaseTransitions >= 0
|
|
159
|
-
&& canonicalJson(Object.keys(value.spec).sort()) === canonicalJson(MUTEX_FIELDS)
|
|
160
|
-
&& Number.isFinite(timeValue(value.spec.acquireTime)) && Number.isFinite(timeValue(value.spec.renewTime)), "mutex tuple, holder or duration differs");
|
|
161
|
-
return wire;
|
|
162
|
-
}
|
|
163
|
-
async enter() {
|
|
164
|
-
const path = `${LEASES}/${this.name()}`;
|
|
165
|
-
const previous = await this.deps.api.request(path, "GET");
|
|
166
|
-
if (previous) {
|
|
167
|
-
this.validate(previous);
|
|
168
|
-
requireSlot(Date.parse(previous.spec.renewTime) + 120_000 <= this.deps.now(), "mutex is occupied");
|
|
169
|
-
}
|
|
170
|
-
const transitions = previous ? previous.spec.leaseTransitions + 1 : 0;
|
|
171
|
-
requireSlot(Number.isSafeInteger(transitions), "mutex transition counter overflow");
|
|
172
|
-
const spec = { holderIdentity: this.owner.token, leaseDurationSeconds: 120, acquireTime: wireTime(this.deps.now()), renewTime: wireTime(this.deps.now()), leaseTransitions: transitions };
|
|
173
|
-
this.lease = await this.deps.api.request(previous ? path : LEASES, previous ? "PUT" : "POST", leaseBody(this.name(), this.owner, previous, spec));
|
|
174
|
-
this.validate(this.lease);
|
|
175
|
-
requireSlot(canonicalJson(this.validate(this.lease)) === canonicalJson(this.owner), "mutex creation returned another holder");
|
|
176
|
-
this.timer = setInterval(() => { void this.touch().catch(err => { this.failure = err; }); }, 20_000);
|
|
177
|
-
this.timer.unref();
|
|
178
|
-
}
|
|
179
|
-
async touch() {
|
|
180
|
-
return this.queue(async () => {
|
|
181
|
-
if (this.failure)
|
|
182
|
-
throw this.failure;
|
|
183
|
-
const path = `${LEASES}/${this.name()}`;
|
|
184
|
-
const live = await this.deps.api.request(path, "GET");
|
|
185
|
-
const wire = this.validate(live);
|
|
186
|
-
requireSlot(live.metadata.uid === this.lease.metadata.uid && canonicalJson(wire) === canonicalJson(this.owner)
|
|
187
|
-
&& Date.parse(live.spec.renewTime) + 120_000 > this.deps.now(), "mutex ownership expired or changed");
|
|
188
|
-
this.lease = await this.deps.api.request(path, "PUT", leaseBody(this.name(), this.owner, live, { ...live.spec, renewTime: wireTime(this.deps.now()) }));
|
|
189
|
-
this.validate(this.lease);
|
|
190
|
-
requireSlot(this.lease.metadata.uid === live.metadata.uid && canonicalJson(this.validate(this.lease)) === canonicalJson(this.owner) && Date.parse(this.lease.spec.renewTime) + 120_000 > this.deps.now(), "mutex renewal did not preserve ownership");
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
async exit() {
|
|
194
|
-
if (this.timer)
|
|
195
|
-
clearInterval(this.timer);
|
|
196
|
-
await this.tail;
|
|
197
|
-
if (!this.lease || this.failure)
|
|
198
|
-
return;
|
|
199
|
-
try {
|
|
200
|
-
await this.queue(async () => {
|
|
201
|
-
const path = `${LEASES}/${this.name()}`;
|
|
202
|
-
const live = await this.deps.api.request(path, "GET");
|
|
203
|
-
requireSlot(live?.metadata?.uid === this.lease.metadata.uid && canonicalJson(this.validate(live)) === canonicalJson(this.owner), "mutex release owner differs");
|
|
204
|
-
await this.deps.api.request(path, "PUT", leaseBody(this.name(), this.owner, live, { ...live.spec, renewTime: "1970-01-01T00:00:00.000000Z" }));
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
catch { /* Unknown release never removes durable reservation; mutex expires naturally. */ }
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
async function withMutex(deps, slot, action) {
|
|
211
|
-
const mutex = new Mutex(deps, slot);
|
|
212
|
-
try {
|
|
213
|
-
await mutex.enter();
|
|
214
|
-
return await action(mutex);
|
|
215
|
-
}
|
|
216
|
-
finally {
|
|
217
|
-
await mutex.exit();
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
async function noOtherClaim(deps, slot, ownUid) {
|
|
221
|
-
let next = "";
|
|
222
|
-
for (let page = 0; page < 10; page++) {
|
|
223
|
-
const result = await deps.api.request(`${CLAIMS}?limit=500${next ? `&continue=${encodeURIComponent(next)}` : ""}`, "GET");
|
|
224
|
-
requireSlot(result?.kind === "ApplianceClaimList" && result.apiVersion === "calltelemetry.com/v1alpha1" && Array.isArray(result.items), "claim occupancy list unavailable");
|
|
225
|
-
for (const claim of result.items) {
|
|
226
|
-
if (claim.metadata?.uid === ownUid)
|
|
227
|
-
continue;
|
|
228
|
-
const id = claim.spec?.vmid;
|
|
229
|
-
const node = claim.spec?.node;
|
|
230
|
-
const alias = node === "proxmox-lab" ? "proxmox" : ["proxmox-mini", "proxmox-minis-lab"].includes(node) ? "minis" : node === "proxmox-ibm64" ? "ibm64" : node;
|
|
231
|
-
if (String(id) === String(slot.vmid) && (alias === slot.node || !["minis", "proxmox", "ibm64", "esxi"].includes(alias)))
|
|
232
|
-
throw new Error("physical slot has another existing ApplianceClaim; retain reservation");
|
|
233
|
-
}
|
|
234
|
-
next = result.metadata?.continue || "";
|
|
235
|
-
requireSlot(typeof next === "string", "claim occupancy pagination malformed");
|
|
236
|
-
if (!next)
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
throw new Error("physical slot claim occupancy scan incomplete; retain reservation");
|
|
240
|
-
}
|
|
241
|
-
export async function createPhysicalClaim(manifest, deps = defaults()) {
|
|
242
|
-
requireSlot(manifest.metadata?.namespace === "ct-lab", "namespace must be ct-lab");
|
|
243
|
-
objectName.parse(manifest.metadata.name);
|
|
244
|
-
manifest = { ...manifest, spec: effectiveClaimSpec(manifest.spec) };
|
|
245
|
-
const slot = claimPhysicalSlot(manifest);
|
|
246
|
-
requireSlot(typeof manifest.spec.vmName === "string" && manifest.spec.vmName.length > 0, "constructor must provide the actual VM name before claim POST");
|
|
247
|
-
requireSlot(Number.isInteger(manifest.spec?.ttlHours) && manifest.spec.ttlHours > 0 && manifest.spec.ttlHours <= 8760, "dynamic claim requires finite TTL");
|
|
248
|
-
const context = ContextSchema.parse({ kind: "mcp", ...(actualClaimIssue(manifest) ? { issueKey: actualClaimIssue(manifest) } : {}) });
|
|
249
|
-
const requestSha256 = claimCreationSha256(manifest);
|
|
250
|
-
return withMutex(deps, slot, async (mutex) => {
|
|
251
|
-
const path = `${LEASES}/${slotLeaseName("reservation", slot)}`;
|
|
252
|
-
let existing = await deps.api.request(path, "GET");
|
|
253
|
-
if (existing) {
|
|
254
|
-
const held = reservation(existing, slot);
|
|
255
|
-
requireSlot(["bound", "provider-bound"].includes(held.phase) && held.requestSha256 === requestSha256
|
|
256
|
-
&& canonicalJson(held.context) === canonicalJson(context) && held.intendedClaim.name === manifest.metadata.name, "durable reservation is occupied");
|
|
257
|
-
const live = await deps.api.request(`${CLAIMS}/${manifest.metadata.name}`, "GET");
|
|
258
|
-
verifyClaim(live, held, held.claim.uid);
|
|
259
|
-
requireSlot(!live.metadata.deletionTimestamp && live.spec?.closed !== true && live.spec?.state !== "Closed" && live.status?.phase !== "Closed", "bound claim is retiring");
|
|
260
|
-
requireSlot(Number.isInteger(live.spec?.ttlHours) && live.spec.ttlHours >= manifest.spec.ttlHours && live.spec.ttlHours <= 8760 && live.spec.claimType !== "fixture", "bound claim finite TTL differs");
|
|
261
|
-
if (live.status?.phase === "Ready" || live.status?.completionTime) {
|
|
262
|
-
const baseline = Date.parse(live.status?.completionTime || "");
|
|
263
|
-
requireSlot(Number.isFinite(baseline) && baseline + live.spec.ttlHours * 3_600_000 > deps.now(), "bound claim expired or Ready TTL baseline unavailable");
|
|
264
|
-
}
|
|
265
|
-
await noOtherClaim(deps, slot, live.metadata.uid);
|
|
266
|
-
await mutex.touch();
|
|
267
|
-
const current = await deps.api.request(path, "GET");
|
|
268
|
-
requireSlot(current?.metadata?.uid === existing.metadata.uid && canonicalJson(reservation(current, slot)) === canonicalJson(held), "bound reservation changed during retry");
|
|
269
|
-
return { claim: live, reservation: { uid: existing.metadata.uid, creationOwnerSha256: creationOwnerSha(held), record: held }, reused: true };
|
|
270
|
-
}
|
|
271
|
-
await noOtherClaim(deps, slot);
|
|
272
|
-
const record = ReservationSchema.parse({ schema: "physical-slot-reservation/v1", slot, phase: "provisional", operationNonce: deps.nonce(), requestSha256,
|
|
273
|
-
intendedClaim: { namespace: "ct-lab", name: manifest.metadata.name }, context, claim: null, provider: null });
|
|
274
|
-
await mutex.touch();
|
|
275
|
-
existing = await deps.api.request(LEASES, "POST", leaseBody(slotLeaseName("reservation", slot), record));
|
|
276
|
-
requireSlot(canonicalJson(reservation(existing, slot)) === canonicalJson(record), "reservation creation returned another owner");
|
|
277
|
-
const protectedManifest = { ...manifest, metadata: { ...manifest.metadata, annotations: { ...(manifest.metadata.annotations || {}), [SLOT_NONCE]: record.operationNonce, [SLOT_REQUEST]: requestSha256 } } };
|
|
278
|
-
await mutex.touch();
|
|
279
|
-
const response = await deps.api.request(CLAIMS, "POST", protectedManifest);
|
|
280
|
-
requireSlot(uuid.safeParse(response?.metadata?.uid).success, "claim creation response lacks actual UID");
|
|
281
|
-
const live = await deps.api.request(`${CLAIMS}/${manifest.metadata.name}`, "GET");
|
|
282
|
-
verifyClaim(live, record, response.metadata.uid);
|
|
283
|
-
requireSlot(!live.metadata.deletionTimestamp, "new claim is already deleting");
|
|
284
|
-
const bound = { ...record, phase: "bound", claim: { ...record.intendedClaim, uid: live.metadata.uid } };
|
|
285
|
-
await mutex.touch();
|
|
286
|
-
const current = await deps.api.request(path, "GET");
|
|
287
|
-
requireSlot(current?.metadata?.uid === existing.metadata.uid && canonicalJson(reservation(current, slot)) === canonicalJson(record), "provisional reservation changed before UID binding");
|
|
288
|
-
existing = await deps.api.request(path, "PUT", leaseBody(slotLeaseName("reservation", slot), bound, current));
|
|
289
|
-
requireSlot(existing?.metadata?.uid === current.metadata.uid && canonicalJson(reservation(existing, slot)) === canonicalJson(bound), "UID binding not independently confirmed");
|
|
290
|
-
return { claim: live, reservation: { uid: existing.metadata.uid, creationOwnerSha256: creationOwnerSha(bound), record: bound }, reused: false };
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
export async function deletePhysicalClaim(name, expectedUid, deps = defaults()) {
|
|
294
|
-
objectName.parse(name);
|
|
295
|
-
uuid.parse(expectedUid);
|
|
296
|
-
const live = await deps.api.request(`${CLAIMS}/${name}`, "GET");
|
|
297
|
-
requireSlot(live?.metadata?.uid === expectedUid, "original selected claim UID differs or is absent");
|
|
298
|
-
const slot = claimPhysicalSlot(live);
|
|
299
|
-
return withMutex(deps, slot, async (mutex) => {
|
|
300
|
-
const path = `${LEASES}/${slotLeaseName("reservation", slot)}`;
|
|
301
|
-
let lease = await deps.api.request(path, "GET");
|
|
302
|
-
if (lease === null)
|
|
303
|
-
throw new UnreservedClaimError(name, slot);
|
|
304
|
-
const held = reservation(lease, slot);
|
|
305
|
-
requireSlot(["bound", "provider-bound", "retiring"].includes(held.phase) && held.claim?.uid === expectedUid && held.intendedClaim.name === name, "claim does not own the bound reservation");
|
|
306
|
-
let selected = await deps.api.request(`${CLAIMS}/${name}`, "GET");
|
|
307
|
-
verifyClaim(selected, held, expectedUid);
|
|
308
|
-
const retiring = { ...held, phase: "retiring" };
|
|
309
|
-
await mutex.touch();
|
|
310
|
-
lease = await deps.api.request(path, "PUT", leaseBody(slotLeaseName("reservation", slot), retiring, lease));
|
|
311
|
-
requireSlot(canonicalJson(reservation(lease, slot)) === canonicalJson(retiring), "retiring reservation write failed");
|
|
312
|
-
await mutex.touch();
|
|
313
|
-
selected = await deps.api.request(`${CLAIMS}/${name}`, "GET");
|
|
314
|
-
verifyClaim(selected, retiring, expectedUid);
|
|
315
|
-
await deps.api.request(`${CLAIMS}/${name}`, "DELETE", { apiVersion: "v1", kind: "DeleteOptions", preconditions: { uid: expectedUid, resourceVersion: selected.metadata.resourceVersion } });
|
|
316
|
-
return { requested: true, expectedUid, reservationRetained: true, phase: "retiring", next: "The governed operator/controller must prove original claim, provider and owned-volume absence before releasing physical-slot custody." };
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
//# sourceMappingURL=physical-slot.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"physical-slot.js","sourceRoot":"","sources":["../../../src/tools/physical-slot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type SlotMethod = "GET" | "POST" | "PUT" | "DELETE";
|
|
2
|
-
export interface SlotApi {
|
|
3
|
-
request(path: string, method: SlotMethod, body?: unknown): Promise<any | null>;
|
|
4
|
-
}
|
|
5
|
-
export declare class SlotApiError extends Error {
|
|
6
|
-
readonly status: number | null;
|
|
7
|
-
constructor(status: number | null, message: string);
|
|
8
|
-
}
|
|
9
|
-
export declare function assertSlotPath(path: string, method: SlotMethod): void;
|
|
10
|
-
/** Names the denied operation from the request itself. Remote error text is never echoed. */
|
|
11
|
-
export declare function describeSlotRequest(path: string, method: SlotMethod): string;
|
|
12
|
-
export declare function slotFailureMessage(status: number | null, path: string, method: SlotMethod): string;
|
|
13
|
-
export declare function createSlotApi(): SlotApi;
|
|
14
|
-
//# sourceMappingURL=slot-kubernetes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slot-kubernetes.d.ts","sourceRoot":"","sources":["../../../src/tools/slot-kubernetes.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;AAC3D,MAAM,WAAW,OAAO;IAAG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAAE;AAC5G,qBAAa,YAAa,SAAQ,KAAK;aACT,MAAM,EAAE,MAAM,GAAG,IAAI;gBAArB,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM;CACnE;AAGD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAUrE;AACD,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAO5E;AACD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAIlG;AAOD,wBAAgB,aAAa,IAAI,OAAO,CAgCvC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slot-kubernetes.js","sourceRoot":"","sources":["../../../src/tools/slot-kubernetes.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|