@calltelemetry/ct-lab-mcp 0.8.91 → 0.8.92
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 +4 -4
- 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/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/index.js +1 -1
- 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/{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/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/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
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
export declare const
|
|
4
|
-
export declare const
|
|
5
|
-
export declare const
|
|
6
|
-
declare const
|
|
2
|
+
import type { ClaimApi } from "./claim-kubernetes.js";
|
|
3
|
+
export declare const LEGACY_SLOT_ANNOTATION = "calltelemetry.com/physical-slot";
|
|
4
|
+
export declare const LEGACY_SLOT_NONCE = "calltelemetry.com/physical-slot-operation-nonce";
|
|
5
|
+
export declare const LEGACY_SLOT_REQUEST = "calltelemetry.com/physical-slot-request-sha256";
|
|
6
|
+
export declare const LEASES = "/apis/coordination.k8s.io/v1/namespaces/ct-lab/leases";
|
|
7
|
+
export declare const printable: z.ZodString;
|
|
8
|
+
export declare const uuid: z.ZodEffects<z.ZodString, string, string>;
|
|
9
|
+
export declare const sha: z.ZodString;
|
|
10
|
+
export declare const objectName: z.ZodEffects<z.ZodString, string, string>;
|
|
11
|
+
export declare const GuestSchema: z.ZodObject<{
|
|
7
12
|
hostAssetId: z.ZodString;
|
|
8
13
|
node: z.ZodString;
|
|
9
14
|
vmid: z.ZodNumber;
|
|
@@ -16,8 +21,64 @@ declare const SlotSchema: z.ZodObject<{
|
|
|
16
21
|
vmid: number;
|
|
17
22
|
hostAssetId: string;
|
|
18
23
|
}>;
|
|
19
|
-
export type
|
|
20
|
-
export declare const
|
|
24
|
+
export type ClaimGuest = z.infer<typeof GuestSchema>;
|
|
25
|
+
export declare const ContextSchema: z.ZodDiscriminatedUnion<"kind", [z.ZodObject<{
|
|
26
|
+
kind: z.ZodLiteral<"mcp">;
|
|
27
|
+
issueKey: z.ZodOptional<z.ZodString>;
|
|
28
|
+
}, "strict", z.ZodTypeAny, {
|
|
29
|
+
kind: "mcp";
|
|
30
|
+
issueKey?: string | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
kind: "mcp";
|
|
33
|
+
issueKey?: string | undefined;
|
|
34
|
+
}>, z.ZodObject<{
|
|
35
|
+
kind: z.ZodLiteral<"operator">;
|
|
36
|
+
issueKey: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strict", z.ZodTypeAny, {
|
|
38
|
+
kind: "operator";
|
|
39
|
+
issueKey?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
kind: "operator";
|
|
42
|
+
issueKey?: string | undefined;
|
|
43
|
+
}>, z.ZodObject<{
|
|
44
|
+
kind: z.ZodLiteral<"ct-meta">;
|
|
45
|
+
logicalAssetId: z.ZodString;
|
|
46
|
+
issueKey: z.ZodString;
|
|
47
|
+
importOperationId: z.ZodString;
|
|
48
|
+
}, "strict", z.ZodTypeAny, {
|
|
49
|
+
kind: "ct-meta";
|
|
50
|
+
issueKey: string;
|
|
51
|
+
logicalAssetId: string;
|
|
52
|
+
importOperationId: string;
|
|
53
|
+
}, {
|
|
54
|
+
kind: "ct-meta";
|
|
55
|
+
issueKey: string;
|
|
56
|
+
logicalAssetId: string;
|
|
57
|
+
importOperationId: string;
|
|
58
|
+
}>]>;
|
|
59
|
+
export declare const ProviderSchema: z.ZodObject<{
|
|
60
|
+
uuid: z.ZodEffects<z.ZodString, string, string>;
|
|
61
|
+
vmName: z.ZodString;
|
|
62
|
+
managedOwnershipSha256: z.ZodString;
|
|
63
|
+
volumes: z.ZodArray<z.ZodString, "many">;
|
|
64
|
+
}, "strict", z.ZodTypeAny, {
|
|
65
|
+
uuid: string;
|
|
66
|
+
vmName: string;
|
|
67
|
+
managedOwnershipSha256: string;
|
|
68
|
+
volumes: string[];
|
|
69
|
+
}, {
|
|
70
|
+
uuid: string;
|
|
71
|
+
vmName: string;
|
|
72
|
+
managedOwnershipSha256: string;
|
|
73
|
+
volumes: string[];
|
|
74
|
+
}>;
|
|
75
|
+
export declare function canonicalJson(value: any): string;
|
|
76
|
+
export declare const digest: (value: any) => string;
|
|
77
|
+
export declare function requireCustody(ok: unknown, message: string): asserts ok;
|
|
78
|
+
/** Strict JSON annotation parse: JSON syntax only, duplicate (or escaped duplicate) keys rejected, bounded. */
|
|
79
|
+
export declare function annotationJson(text: unknown): any;
|
|
80
|
+
export declare function claimGuest(claim: any): ClaimGuest;
|
|
81
|
+
export declare const LegacyReservationSchema: z.ZodObject<{
|
|
21
82
|
schema: z.ZodLiteral<"physical-slot-reservation/v1">;
|
|
22
83
|
slot: z.ZodObject<{
|
|
23
84
|
hostAssetId: z.ZodString;
|
|
@@ -183,36 +244,14 @@ export declare const ReservationSchema: z.ZodObject<{
|
|
|
183
244
|
volumes: string[];
|
|
184
245
|
} | null;
|
|
185
246
|
}>;
|
|
186
|
-
export type
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
readonly slot: PhysicalSlot;
|
|
198
|
-
constructor(claimName: string, slot: PhysicalSlot);
|
|
199
|
-
}
|
|
200
|
-
export declare function canonicalJson(value: any): string;
|
|
201
|
-
export declare function physicalSlot(hostAssetId: string, node: string, vmid: number): PhysicalSlot;
|
|
202
|
-
export declare function slotLeaseName(role: "mutex" | "reservation", slot: PhysicalSlot): string;
|
|
203
|
-
export declare function creationOwnerSha(record: Reservation): string;
|
|
204
|
-
export declare function claimPhysicalSlot(claim: any): PhysicalSlot;
|
|
205
|
-
/** Internal dependency seam; callers cannot supply transport, clocks, nonce or permits. */
|
|
206
|
-
export interface SlotDeps {
|
|
207
|
-
api: SlotApi;
|
|
208
|
-
now: () => number;
|
|
209
|
-
nonce: () => string;
|
|
210
|
-
}
|
|
211
|
-
export declare function createPhysicalClaim(manifest: any, deps?: SlotDeps): Promise<{
|
|
212
|
-
claim: any;
|
|
213
|
-
reservation: any;
|
|
214
|
-
reused: boolean;
|
|
215
|
-
}>;
|
|
216
|
-
export declare function deletePhysicalClaim(name: string, expectedUid: string, deps?: SlotDeps): Promise<any>;
|
|
217
|
-
export {};
|
|
218
|
-
//# sourceMappingURL=physical-slot.d.ts.map
|
|
247
|
+
export type LegacyReservation = z.infer<typeof LegacyReservationSchema>;
|
|
248
|
+
export declare function legacyReservationLeaseName(guest: ClaimGuest): string;
|
|
249
|
+
export declare function parseLegacyReservation(lease: any, guest: ClaimGuest): LegacyReservation;
|
|
250
|
+
/** Verifies a live claim against the legacy reservation (UID, tuple, nonce, request lineage). */
|
|
251
|
+
export declare function verifyLegacyClaim(live: any, record: LegacyReservation, expectedUid?: string): void;
|
|
252
|
+
/** Reads (never writes) the legacy reservation Lease for a guest; null when none exists. */
|
|
253
|
+
export declare function readLegacyReservation(api: ClaimApi, guest: ClaimGuest): Promise<{
|
|
254
|
+
lease: any;
|
|
255
|
+
record: LegacyReservation;
|
|
256
|
+
} | null>;
|
|
257
|
+
//# sourceMappingURL=legacy-reservation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-reservation.d.ts","sourceRoot":"","sources":["../../../src/tools/legacy-reservation.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,iBAAiB,oDAAoD,CAAC;AACnF,eAAO,MAAM,mBAAmB,mDAAmD,CAAC;AACpF,eAAO,MAAM,MAAM,0DAA0D,CAAC;AAE9E,eAAO,MAAM,SAAS,aAAqD,CAAC;AAC5E,eAAO,MAAM,IAAI,2CAAuG,CAAC;AACzH,eAAO,MAAM,GAAG,aAAqC,CAAC;AACtD,eAAO,MAAM,UAAU,2CAAoM,CAAC;AAC5N,eAAO,MAAM,WAAW;;;;;;;;;;;;EAA2G,CAAC;AACpI,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACrD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIxB,CAAC;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAA6J,CAAC;AAEzL,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAIhD;AACD,eAAO,MAAM,MAAM,GAAI,OAAO,GAAG,WAA4E,CAAC;AAE9G,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAEvE;AACD,+GAA+G;AAC/G,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,GAAG,CAKjD;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,UAAU,CAQjD;AAGD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpE;AAOD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,GAAG,iBAAiB,CAUvF;AACD,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAUlG;AACD,4FAA4F;AAC5F,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAAC,CAKvI"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* READ-ONLY legacy physical-slot reservation Lease reader (REL-1746).
|
|
3
|
+
*
|
|
4
|
+
* Claims created before slots were retired carry their original-owner record in a
|
|
5
|
+
* `ct-physical-slot-reservation.*` Lease instead of the `calltelemetry.com/claim-custody`
|
|
6
|
+
* annotation. The appliance operator migrates them; this module only VERIFIES them so the MCP
|
|
7
|
+
* can still resume, renew and delete such claims. It never creates, renews, updates or deletes
|
|
8
|
+
* a Lease (the transport refuses it).
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { load as yamlLoad, JSON_SCHEMA } from "js-yaml";
|
|
13
|
+
import { actualClaimIssue, claimCreationSha256 } from "./claim-creation-projection.js";
|
|
14
|
+
import { CLAIM_NODE_TO_PROXMOX_HOST } from "./proxmox-host-policy.js";
|
|
15
|
+
export const LEGACY_SLOT_ANNOTATION = "calltelemetry.com/physical-slot";
|
|
16
|
+
export const LEGACY_SLOT_NONCE = "calltelemetry.com/physical-slot-operation-nonce";
|
|
17
|
+
export const LEGACY_SLOT_REQUEST = "calltelemetry.com/physical-slot-request-sha256";
|
|
18
|
+
export const LEASES = "/apis/coordination.k8s.io/v1/namespaces/ct-lab/leases";
|
|
19
|
+
export const printable = z.string().min(1).max(256).regex(/^[\x20-\x7e]+$/);
|
|
20
|
+
export const uuid = z.string().uuid().refine(value => value === value.toLowerCase(), "UUID must be canonical lowercase");
|
|
21
|
+
export const sha = z.string().regex(/^[0-9a-f]{64}$/);
|
|
22
|
+
export 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");
|
|
23
|
+
export const GuestSchema = z.object({ hostAssetId: printable, node: printable, vmid: z.number().safe().int().positive() }).strict();
|
|
24
|
+
export const ContextSchema = z.discriminatedUnion("kind", [
|
|
25
|
+
z.object({ kind: z.literal("mcp"), issueKey: printable.optional() }).strict(),
|
|
26
|
+
z.object({ kind: z.literal("operator"), issueKey: printable.optional() }).strict(),
|
|
27
|
+
z.object({ kind: z.literal("ct-meta"), logicalAssetId: printable, issueKey: printable, importOperationId: printable }).strict(),
|
|
28
|
+
]);
|
|
29
|
+
export const ProviderSchema = z.object({ uuid, vmName: printable, managedOwnershipSha256: sha, volumes: z.array(z.string().min(1).max(512).regex(/^[\x20-\x7e]+$/)).max(256) }).strict();
|
|
30
|
+
export function canonicalJson(value) {
|
|
31
|
+
if (Array.isArray(value))
|
|
32
|
+
return `[${value.map(canonicalJson).join(",")}]`;
|
|
33
|
+
if (value !== null && typeof value === "object")
|
|
34
|
+
return `{${Object.keys(value).sort().map(k => `${JSON.stringify(k)}:${canonicalJson(value[k])}`).join(",")}}`;
|
|
35
|
+
return JSON.stringify(value);
|
|
36
|
+
}
|
|
37
|
+
export const digest = (value) => createHash("sha256").update(canonicalJson(value), "utf8").digest("hex");
|
|
38
|
+
export function requireCustody(ok, message) {
|
|
39
|
+
if (!ok)
|
|
40
|
+
throw new Error(`claim custody ${message}; custody unchanged`);
|
|
41
|
+
}
|
|
42
|
+
/** Strict JSON annotation parse: JSON syntax only, duplicate (or escaped duplicate) keys rejected, bounded. */
|
|
43
|
+
export function annotationJson(text) {
|
|
44
|
+
requireCustody(typeof text === "string" && Buffer.byteLength(text) <= 65_536, "annotation JSON unavailable or oversized");
|
|
45
|
+
const value = JSON.parse(text);
|
|
46
|
+
yamlLoad(text, { schema: JSON_SCHEMA, json: false });
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
export function claimGuest(claim) {
|
|
50
|
+
const node = claim?.spec?.node;
|
|
51
|
+
const hostAssetId = typeof node === "string" && Object.hasOwn(CLAIM_NODE_TO_PROXMOX_HOST, node)
|
|
52
|
+
? CLAIM_NODE_TO_PROXMOX_HOST[node]
|
|
53
|
+
: undefined;
|
|
54
|
+
requireCustody(hostAssetId, "requires a canonical Proxmox claim node");
|
|
55
|
+
requireCustody(Number.isSafeInteger(claim.spec.vmid) && claim.spec.vmid >= 100 && claim.spec.vmid <= 8999, "requires an explicit provider VMID");
|
|
56
|
+
return GuestSchema.parse({ hostAssetId, node, vmid: claim.spec.vmid });
|
|
57
|
+
}
|
|
58
|
+
const ClaimIdentitySchema = z.object({ namespace: z.literal("ct-lab"), name: objectName, uid: uuid }).strict();
|
|
59
|
+
export const LegacyReservationSchema = z.object({
|
|
60
|
+
schema: z.literal("physical-slot-reservation/v1"), slot: GuestSchema,
|
|
61
|
+
phase: z.enum(["provisional", "bound", "provider-bound", "retiring", "released"]),
|
|
62
|
+
operationNonce: uuid, requestSha256: sha,
|
|
63
|
+
intendedClaim: z.object({ namespace: z.literal("ct-lab"), name: objectName }).strict(), context: ContextSchema,
|
|
64
|
+
claim: ClaimIdentitySchema.nullable(),
|
|
65
|
+
provider: ProviderSchema.nullable(),
|
|
66
|
+
}).strict();
|
|
67
|
+
export function legacyReservationLeaseName(guest) {
|
|
68
|
+
GuestSchema.parse(guest);
|
|
69
|
+
const hash = digest([guest.hostAssetId, guest.node, guest.vmid]);
|
|
70
|
+
return `ct-physical-slot-reservation.${hash.slice(0, 32)}.${hash.slice(32)}`;
|
|
71
|
+
}
|
|
72
|
+
function leaseEnvelope(lease, name) {
|
|
73
|
+
requireCustody(lease?.apiVersion === "coordination.k8s.io/v1" && lease.kind === "Lease"
|
|
74
|
+
&& lease.metadata?.namespace === "ct-lab" && lease.metadata.name === name
|
|
75
|
+
&& uuid.safeParse(lease.metadata.uid).success && typeof lease.metadata.resourceVersion === "string"
|
|
76
|
+
&& lease.metadata.resourceVersion.length > 0 && !lease.metadata.deletionTimestamp, "legacy Lease identity or CAS version differs");
|
|
77
|
+
}
|
|
78
|
+
export function parseLegacyReservation(lease, guest) {
|
|
79
|
+
leaseEnvelope(lease, legacyReservationLeaseName(guest));
|
|
80
|
+
const record = LegacyReservationSchema.parse(annotationJson(lease.metadata.annotations?.[LEGACY_SLOT_ANNOTATION]));
|
|
81
|
+
requireCustody(canonicalJson(record.slot) === canonicalJson(guest), "legacy stored full tuple differs");
|
|
82
|
+
requireCustody(lease.spec && Object.keys(lease.spec).length === 0, "legacy durable reservation has expiring lease semantics");
|
|
83
|
+
requireCustody(record.phase === "provisional" ? record.claim === null && record.provider === null : record.claim !== null, "legacy phase and claim binding differ");
|
|
84
|
+
if (record.claim)
|
|
85
|
+
requireCustody(record.claim.namespace === record.intendedClaim.namespace && record.claim.name === record.intendedClaim.name, "legacy bound claim differs from original intent");
|
|
86
|
+
if (record.provider)
|
|
87
|
+
requireCustody(canonicalJson(record.provider.volumes) === canonicalJson([...new Set(record.provider.volumes)].sort()), "legacy provider volumes are not sorted and unique");
|
|
88
|
+
requireCustody(record.phase !== "provider-bound" || record.provider !== null, "legacy provider phase lacks immutable provider binding");
|
|
89
|
+
return record;
|
|
90
|
+
}
|
|
91
|
+
/** Verifies a live claim against the legacy reservation (UID, tuple, nonce, request lineage). */
|
|
92
|
+
export function verifyLegacyClaim(live, record, expectedUid) {
|
|
93
|
+
requireCustody(live?.apiVersion === "calltelemetry.com/v1alpha1" && live.kind === "ApplianceClaim"
|
|
94
|
+
&& live.metadata?.namespace === record.intendedClaim.namespace && live.metadata.name === record.intendedClaim.name
|
|
95
|
+
&& uuid.safeParse(live.metadata.uid).success && (!expectedUid || live.metadata.uid === expectedUid)
|
|
96
|
+
&& typeof live.metadata.resourceVersion === "string" && live.metadata.resourceVersion.length > 0
|
|
97
|
+
&& canonicalJson(claimGuest(live)) === canonicalJson(record.slot)
|
|
98
|
+
&& live.metadata.annotations?.[LEGACY_SLOT_NONCE] === record.operationNonce
|
|
99
|
+
&& live.metadata.annotations?.[LEGACY_SLOT_REQUEST] === record.requestSha256
|
|
100
|
+
&& (actualClaimIssue(live) ?? null) === (record.context.issueKey ?? null)
|
|
101
|
+
&& claimCreationSha256(live) === record.requestSha256, "independent claim UID, tuple or source lineage differs");
|
|
102
|
+
}
|
|
103
|
+
/** Reads (never writes) the legacy reservation Lease for a guest; null when none exists. */
|
|
104
|
+
export async function readLegacyReservation(api, guest) {
|
|
105
|
+
const name = legacyReservationLeaseName(guest);
|
|
106
|
+
const lease = await api.request(`${LEASES}/${name}`, "GET");
|
|
107
|
+
if (!lease)
|
|
108
|
+
return null;
|
|
109
|
+
return { lease, record: parseLegacyReservation(lease, guest) };
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=legacy-reservation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-reservation.js","sourceRoot":"","sources":["../../../src/tools/legacy-reservation.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ export interface OperatorClaimClient {
|
|
|
4
4
|
getClaim(name: string): Promise<any>;
|
|
5
5
|
/** Merge patch with an optional resourceVersion precondition. */
|
|
6
6
|
patchClaimTtl(name: string, resourceVersion: string | undefined, ttlHours: number): Promise<void>;
|
|
7
|
-
/**
|
|
7
|
+
/** READ-ONLY legacy reservation Lease; null when it does not exist. */
|
|
8
8
|
getLease(name: string): Promise<any | null>;
|
|
9
9
|
}
|
|
10
10
|
export declare function defaultOperatorClaimClient(): OperatorClaimClient;
|
|
@@ -22,6 +22,7 @@ export interface ClaimExtension {
|
|
|
22
22
|
status: "bound" | "absent";
|
|
23
23
|
phase?: string;
|
|
24
24
|
name: string;
|
|
25
|
+
source?: "annotation" | "legacy-lease";
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
/** Pure: the ttlHours the claim needs so its expiry covers the lease. Never shortens. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renewal-claim.d.ts","sourceRoot":"","sources":["../../../src/tools/renewal-claim.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renewal-claim.d.ts","sourceRoot":"","sources":["../../../src/tools/renewal-claim.ts"],"names":[],"mappings":"AAoBA,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,iEAAiE;IACjE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClG,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAC7C;AAED,wBAAgB,0BAA0B,IAAI,mBAAmB,CAiChE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,GAAG,gBAAgB,GAAG,WAAW,CAAC;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE;QAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,YAAY,GAAG,cAAc,CAAA;KAAE,CAAC;CACnH;AAOD,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzF;AA0BD,mHAAmH;AACnH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAKlG;AAED,mEAAmE;AACnE,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,OAAO,CAAC,cAAc,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBxL;AAED,0FAA0F;AAC1F,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5J;AAED,kHAAkH;AAClH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAOlK"}
|
|
@@ -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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"}
|
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.92",
|
|
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"}
|