@homeflare/alchemy 0.36.0 → 0.37.1
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 +14 -0
- package/dist/argocd/cluster.d.ts +102 -0
- package/dist/argocd/cluster.d.ts.map +1 -0
- package/dist/argocd/credentials.d.ts +37 -0
- package/dist/argocd/credentials.d.ts.map +1 -0
- package/dist/argocd/fake-argocd.d.ts +42 -0
- package/dist/argocd/fake-argocd.d.ts.map +1 -0
- package/dist/argocd/git-credentials.d.ts +29 -0
- package/dist/argocd/git-credentials.d.ts.map +1 -0
- package/dist/argocd/index.d.ts +19 -0
- package/dist/argocd/index.d.ts.map +1 -0
- package/dist/argocd/index.js +306 -0
- package/dist/argocd/index.js.map +17 -0
- package/dist/argocd/providers.d.ts +13 -0
- package/dist/argocd/providers.d.ts.map +1 -0
- package/dist/argocd/repo-creds.d.ts +67 -0
- package/dist/argocd/repo-creds.d.ts.map +1 -0
- package/dist/argocd/repository.d.ts +87 -0
- package/dist/argocd/repository.d.ts.map +1 -0
- package/dist/argocd/resource.d.ts +90 -0
- package/dist/argocd/resource.d.ts.map +1 -0
- package/dist/cloudflare/index.js +4 -4
- package/dist/cloudflare/index.js.map +3 -3
- package/dist/cloudflare/r2-bucket-lock.d.ts +14 -5
- package/dist/cloudflare/r2-bucket-lock.d.ts.map +1 -1
- package/dist/litellm/index.js.map +2 -2
- package/dist/litellm/operations.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon-form.d.ts +4 -5
- package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon-wire.d.ts +31 -0
- package/dist/proxmox/ceph-daemon-wire.d.ts.map +1 -0
- package/dist/proxmox/ceph-daemon.d.ts +40 -6
- package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
- package/dist/proxmox/ceph-fs-distilled.d.ts +33 -0
- package/dist/proxmox/ceph-fs-distilled.d.ts.map +1 -0
- package/dist/proxmox/ceph-fs-wire.d.ts +20 -11
- package/dist/proxmox/ceph-fs-wire.d.ts.map +1 -1
- package/dist/proxmox/ceph-fs.d.ts +30 -6
- package/dist/proxmox/ceph-fs.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd-tree.d.ts +12 -3
- package/dist/proxmox/ceph-osd-tree.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd-write.d.ts +17 -2
- package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd.d.ts +6 -0
- package/dist/proxmox/ceph-osd.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool-settle.d.ts +19 -12
- package/dist/proxmox/ceph-pool-settle.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool-wire.d.ts +37 -0
- package/dist/proxmox/ceph-pool-wire.d.ts.map +1 -0
- package/dist/proxmox/ceph-pool.d.ts +10 -5
- package/dist/proxmox/ceph-pool.d.ts.map +1 -1
- package/dist/proxmox/group-wire.d.ts +8 -13
- package/dist/proxmox/group-wire.d.ts.map +1 -1
- package/dist/proxmox/index.js +605 -483
- package/dist/proxmox/index.js.map +20 -17
- package/dist/proxmox/storage-wire.d.ts +15 -11
- package/dist/proxmox/storage-wire.d.ts.map +1 -1
- package/dist/proxmox/unreadable-read.d.ts +7 -7
- package/dist/proxmox/user-wire.d.ts +8 -11
- package/dist/proxmox/user-wire.d.ts.map +1 -1
- package/dist/proxmox/user.d.ts +5 -5
- package/docs/argocd-kubernetes.md +100 -0
- package/docs/argocd.md +139 -0
- package/docs/credentials.md +9 -0
- package/docs/distilled-interim.md +15 -3
- package/docs/litellm.md +17 -0
- package/docs/peers.md +7 -0
- package/docs/provider-standard.md +24 -6
- package/docs/proxmox.md +20 -0
- package/docs/unifi.md +45 -0
- package/docs/upstream-conformance-bun.md +67 -0
- package/docs/upstream-conformance-conforms.md +55 -0
- package/docs/upstream-conformance-families.md +95 -0
- package/docs/upstream-conformance-grafana.md +106 -0
- package/docs/upstream-conformance.md +20 -298
- package/package.json +8 -3
- package/src/argocd/cluster.test.ts +120 -0
- package/src/argocd/cluster.ts +222 -0
- package/src/argocd/credentials.ts +38 -0
- package/src/argocd/fake-argocd.ts +60 -0
- package/src/argocd/git-credentials.ts +71 -0
- package/src/argocd/index.ts +40 -0
- package/src/argocd/providers.ts +17 -0
- package/src/argocd/repo-creds.test.ts +123 -0
- package/src/argocd/repo-creds.ts +115 -0
- package/src/argocd/repository.test.ts +167 -0
- package/src/argocd/repository.ts +165 -0
- package/src/argocd/resource.ts +150 -0
- package/src/cloudflare/r2-bucket-lock.test.ts +54 -18
- package/src/cloudflare/r2-bucket-lock.ts +25 -18
- package/src/litellm/operations.ts +8 -4
- package/src/proxmox/ceph-daemon-form.ts +7 -8
- package/src/proxmox/ceph-daemon-wire.ts +112 -0
- package/src/proxmox/ceph-daemon-write.test.ts +158 -0
- package/src/proxmox/ceph-daemon.ts +70 -53
- package/src/proxmox/ceph-fs-delete.test.ts +81 -0
- package/src/proxmox/ceph-fs-distilled.ts +100 -0
- package/src/proxmox/ceph-fs-wire.ts +17 -31
- package/src/proxmox/ceph-fs-write.test.ts +67 -0
- package/src/proxmox/ceph-fs.ts +68 -73
- package/src/proxmox/ceph-osd-tree.ts +14 -5
- package/src/proxmox/ceph-osd-write.test.ts +61 -0
- package/src/proxmox/ceph-osd-write.ts +33 -6
- package/src/proxmox/ceph-osd.ts +6 -0
- package/src/proxmox/ceph-pool-settle.ts +24 -17
- package/src/proxmox/ceph-pool-wire.ts +101 -0
- package/src/proxmox/ceph-pool-write.test.ts +146 -0
- package/src/proxmox/ceph-pool.ts +87 -98
- package/src/proxmox/group-wire.ts +7 -12
- package/src/proxmox/read-failure-propagation.test.ts +5 -5
- package/src/proxmox/storage-wire.ts +9 -10
- package/src/proxmox/typed-absence.test.ts +146 -0
- package/src/proxmox/unreadable-read.ts +7 -7
- package/src/proxmox/user-wire.ts +7 -10
- package/src/proxmox/user.ts +5 -5
- package/src/proxmox/distilled-task-await.test.ts +0 -124
|
@@ -48,6 +48,17 @@
|
|
|
48
48
|
* user needs 'Sys.Audit' permissions on '/nodes/<node>' if they are not the owner of the task."
|
|
49
49
|
* Grant it on the `read` role, or every create burns the full cap below and reports the wrong
|
|
50
50
|
* cause.
|
|
51
|
+
*
|
|
52
|
+
* ★ AS OF 2026-09-24 (decision 43's walk-down, 2c) THIS FILE IS `client.ts`'s HALF ONLY. The read
|
|
53
|
+
* (`readRow`) moved to `ceph-fs-distilled.ts`, and so did the create — `nodes.updateNodeCephFs`
|
|
54
|
+
* (distilled's own misnamed POST, confirmed against its `T.Http` annotation) plus a SEPARATE
|
|
55
|
+
* distilled `settle`, using the raw `getNodeTaskStatus` operation in its own tolerant poll loop
|
|
56
|
+
* rather than `Task.awaitTask`, which does not tolerate a poll failure the way this family needs
|
|
57
|
+
* (network-apply-read.ts's own header has the fuller reasoning). `destroyFs` stays HERE,
|
|
58
|
+
* unmigrated: distilled types `remove_pools`/`remove_storages` as `T.Body` on a DELETE, and the
|
|
59
|
+
* ⛔ two paragraphs up is the MEASURED reason PVE would silently ignore both flags if sent that
|
|
60
|
+
* way — a real protocol gap, not a judgement call. `settle` below is still shared where it can
|
|
61
|
+
* be: `createForm`/`objectPath`/`destroyPath` are pure and reused by the distilled file too.
|
|
51
62
|
*/
|
|
52
63
|
import * as Effect from 'effect/Effect';
|
|
53
64
|
import type { CephFsAttributes, CephFsProps } from './ceph-fs.ts';
|
|
@@ -63,24 +74,22 @@ import type { CephFsAttributes, CephFsProps } from './ceph-fs.ts';
|
|
|
63
74
|
* `reconcile` takes the create branch on exactly that signal.
|
|
64
75
|
*/
|
|
65
76
|
export declare const readRow: (live: Record<string, unknown>, props: CephFsProps) => CephFsAttributes | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* ⚠️ SHORT POLLS, LOW CAP. Ninety seconds covers two pool creates plus the ten seconds `createfs`
|
|
79
|
+
* itself spends waiting for an MDS to go active, and is short enough that a stuck task fails the
|
|
80
|
+
* deploy rather than parking it for the afternoon.
|
|
81
|
+
*/
|
|
82
|
+
export declare const POLL_SECONDS = 2;
|
|
83
|
+
export declare const POLL_ATTEMPTS = 45;
|
|
66
84
|
/** ⚠️ `nodes/{n}/ceph/fs/{name}` — the POST and DELETE target, and NOT where a read goes. */
|
|
67
85
|
export declare const objectPath: (props: CephFsProps) => string;
|
|
86
|
+
/** The vendor rules `createForm` is checked against — `guardWrite`, distilled-guard.ts. */
|
|
87
|
+
export declare const CEPH_FS_CREATE = "pve:POST /nodes/{node}/ceph/fs/{name}";
|
|
68
88
|
/**
|
|
69
89
|
* ⚠️ `name` IS DELIBERATELY ABSENT FROM THE FORM. It is already the last segment of the path being
|
|
70
90
|
* POSTed to — the metric-server.ts case again — and a second copy can only ever disagree with it.
|
|
71
91
|
*/
|
|
72
92
|
export declare const createForm: (props: CephFsProps) => Record<string, string>;
|
|
73
|
-
/**
|
|
74
|
-
* POST the create, then wait for the worker. ⛔ The caller still reads back; see ceph-fs.ts.
|
|
75
|
-
*
|
|
76
|
-
* ⚠️ A CREATE NEEDS A RUNNING *AND* A STANDBY MDS, and refuses BEFORE it forks -- "no running
|
|
77
|
-
* Metadata Server (MDS) found!" / "no standby Metadata Server (MDS) found!" are synchronous, so
|
|
78
|
-
* they surface as a failed POST rather than as a silent worker. C1 has three (MEASURED: node-c
|
|
79
|
-
* `up:active` for cephfs-c1, node-b and node-d `up:standby`), so this is a note for a smaller cluster.
|
|
80
|
-
* ⚠️ BOTH WRITES CHECK `Sys.Modify` ON `/` -- the root, with the breadth metric-server.ts warns
|
|
81
|
-
* about: granting it buys datacenter options and every other cluster-wide config write too.
|
|
82
|
-
*/
|
|
83
|
-
export declare const createFs: (props: CephFsProps) => Effect.Effect<undefined, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
84
93
|
/**
|
|
85
94
|
* DELETE the filesystem, then wait for the worker.
|
|
86
95
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-fs-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-wire.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ceph-fs-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKlE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,SACZ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,SACtB,WAAW,KACjB,gBAAgB,GAAG,SAkBrB,CAAC;AAKF;;;;GAIG;AAEH,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,6FAA6F;AAC7F,eAAO,MAAM,UAAU,UAAW,WAAW,WAAgD,CAAC;AAE9F,2FAA2F;AAC3F,eAAO,MAAM,cAAc,0CAA0C,CAAC;AAMtE;;;GAGG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGnE,CAAC;AA2DH;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,UAAW,WAAW,4IAQxC,CAAC;AAEL;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,UAAW,WAAW,UAK1C,CAAC;AAEJ,eAAO,MAAM,YAAY,UAAW,WAAW,UAK5C,CAAC"}
|
|
@@ -19,12 +19,20 @@
|
|
|
19
19
|
* below returns the INDEX and `attributes` picks this filesystem out of the array client-side —
|
|
20
20
|
* the shape acl.ts uses for the one flat `GET /access/acl`. The POST goes to the `{name}` path,
|
|
21
21
|
* so `collection()` is the LONGER of the two strings, the mirror of metric-server.ts.
|
|
22
|
-
* ⚠️ AND THAT IS WHY
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
22
|
+
* ⚠️ AND THAT IS WHY EVERY HANDLER BELOW IS HAND-WRITTEN rather than taken from a factory. A
|
|
23
|
+
* factory `destroy` deletes the read path, which here is the index: `DELETE /nodes/{node}/
|
|
24
|
+
* ceph/fs` is not a route, so it would fail every destroy while the filesystem stayed exactly
|
|
25
|
+
* where it was. `reconcile` is hand-written for a second, independent reason — the forked
|
|
26
|
+
* worker — set out in ceph-fs-wire.ts. acl.ts is the precedent for a family that genuinely
|
|
27
|
+
* does not fit a shared shape.
|
|
28
|
+
*
|
|
29
|
+
* ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
|
|
30
|
+
* `nodes.listNodeCephFs`/`updateNodeCephFs` for the READ and the CREATE (2026-09-24, decision
|
|
31
|
+
* 43's walk-down, 2c — ceph-fs-distilled.ts). `destroyFs` STAYS on `client.ts`, unmigrated:
|
|
32
|
+
* the SDK originally put `remove-pools`/`remove-storages` in a DELETE body, which PVE ignores.
|
|
33
|
+
* SDK PR #265 fixes that protocol gap; migrating `destroyFs` remains a separate change.
|
|
34
|
+
* The typed-read follow-up removes the catch-all fold from `readFs`: a failed index must
|
|
35
|
+
* fail read/diff/reconcile/delete, not report a missing filesystem or a successful destroy.
|
|
28
36
|
*
|
|
29
37
|
* ⛔ CREATING A CephFS CREATES TWO CEPH POOLS, AND A `Proxmox.CephPool` MUST NOT ALSO DECLARE THEM.
|
|
30
38
|
* `createfs` builds `<name>_data` and `<name>_metadata` itself and refuses outright if either
|
|
@@ -120,5 +128,21 @@ export interface ProxmoxCephFs extends Resource<'Proxmox.CephFs', CephFsProps, C
|
|
|
120
128
|
}
|
|
121
129
|
/** ★ `retain` by default — a filesystem holding data cannot be rebuilt. See the ★ in resource.ts. */
|
|
122
130
|
export declare const ProxmoxCephFs: import("alchemy").ResourceClass<ProxmoxCephFs>;
|
|
131
|
+
/**
|
|
132
|
+
* ⛔ NOTHING IS COMPARED, AND THAT IS THE MOST DELIBERATE LINE IN THIS FILE. A CephFS has no
|
|
133
|
+
* readable, writable field: the index returns only the name and the pools behind it, and every
|
|
134
|
+
* prop this resource accepts is create-time or delete-time. So "present" IS "settled", and the
|
|
135
|
+
* only honest comparison is none at all.
|
|
136
|
+
* ⚠️ THE TEMPTING ADDITION IS `pg_num`, AND IT WOULD BE THE WORST BUG THIS PACKAGE HAS SHIPPED.
|
|
137
|
+
* It is not in the index at all, so it can only be read from the pool endpoint — where the
|
|
138
|
+
* autoscaler owns it. MEASURED on C1 today: created at 128, live at 32, with the metadata
|
|
139
|
+
* pool already scheduled down to 16. Compared, that is an eternal mismatch — and since there
|
|
140
|
+
* is no update path, treating this as a diff would plan a REPLACE. The plan would destroy and
|
|
141
|
+
* rebuild a live filesystem on every deploy, triggered by a daemon on its own schedule.
|
|
142
|
+
* ⚠️ `data_pools` AND `metadata_pool_id` ARE OUT FOR THE ORDINARY REASONS: a set PVE returns
|
|
143
|
+
* in its own order, and an integer id for something written as a name. `name` is out because
|
|
144
|
+
* it is the FILTER that produced these attributes, so comparing it is true by construction —
|
|
145
|
+
* an identity change is handled in `diff`, not here. `node` is out because it is a route.
|
|
146
|
+
*/
|
|
123
147
|
export declare const ProxmoxCephFsProvider: () => import("effect/Layer").Layer<Provider.Provider<ProxmoxCephFs>, never, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
124
148
|
//# sourceMappingURL=ceph-fs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-fs.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ceph-fs.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAK7C,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtE,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,2FAA2F;IAC3F,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAc,SAAQ,QAAQ,CAC7C,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,qGAAqG;AACrG,eAAO,MAAM,aAAa,gDAExB,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,mIAiF/B,CAAC"}
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
* maintenance — the churn-that-reads-like-drift that keeps `digest` out of storage.ts.
|
|
57
57
|
*
|
|
58
58
|
*/
|
|
59
|
+
import * as nodes from '@distilled.cloud/proxmox/nodes';
|
|
59
60
|
import * as Effect from 'effect/Effect';
|
|
60
61
|
import type { CephOsdProps } from './ceph-osd.ts';
|
|
61
62
|
/** A CRUSH node. Buckets carry `children`; an OSD leaf carries `type: 'osd'`. */
|
|
@@ -146,9 +147,17 @@ export declare const osdAttributes: (leaf: CrushNode, props: CephOsdProps) => Ce
|
|
|
146
147
|
* ★ IT LIVES HERE RATHER THAN IN ceph-osd.ts BECAUSE THE READ SIDE IS THIS FILE'S WHOLE JOB —
|
|
147
148
|
* `findOsd` and `osdAttributes` are the two halves it composes, and keeping the caller beside
|
|
148
149
|
* them is what let ceph-osd.ts come back under the 250-line cap when create and delete were
|
|
149
|
-
* added.
|
|
150
|
-
*
|
|
150
|
+
* added.
|
|
151
|
+
*
|
|
152
|
+
* ★ MIGRATED OFF `client.ts`'s `pve()` ONTO `@distilled.cloud/proxmox`'s typed `nodes.
|
|
153
|
+
* getNodeCephOsd` (2026-09-24, decision 43, 2c) — the tree endpoint, confirmed against
|
|
154
|
+
* distilled's own schema to still answer `{flags?, root: unknown}`, matching the shape
|
|
155
|
+
* `osdLeaves` already walks. ⛔ STILL NO `Effect.orElseSucceed` — the ⛔ on `handlers.read` in
|
|
156
|
+
* ceph-osd.ts is unchanged and is still the reason: this path is a collection that always
|
|
157
|
+
* exists while Ceph is installed, so a failure here is never "the OSD is gone" and must
|
|
158
|
+
* propagate rather than fold. This is the one migrated Ceph family that does NOT match
|
|
159
|
+
* ceph-pool-wire.ts's/ceph-fs-distilled.ts's single-fold shape, because it never had it.
|
|
151
160
|
*/
|
|
152
|
-
export declare const readOsd: (props: CephOsdProps) => Effect.Effect<CephOsdAttributes | undefined, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
161
|
+
export declare const readOsd: (props: CephOsdProps) => Effect.Effect<CephOsdAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
153
162
|
export {};
|
|
154
163
|
//# sourceMappingURL=ceph-osd-tree.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-osd-tree.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,iFAAiF;AACjF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAOzC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EAQpD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,SAAU,SAAS,SAAS,MAAM,0BACiB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,EAAE,EAAE,OAAO,CAAC;IACZ,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,SAAS,YAAY,KAAG,iBAanE,CAAC;AAEH
|
|
1
|
+
{"version":3,"file":"ceph-osd-tree.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,iFAAiF;AACjF,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAOzC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,SAAU,SAAS,KAAG,SAAS,EAQpD,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,SAAU,SAAS,SAAS,MAAM,0BACiB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf,iGAAiG;IACjG,EAAE,EAAE,OAAO,CAAC;IACZ,8FAA8F;IAC9F,YAAY,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,GAAG,EAAE,MAAM,CAAC;IACZ,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,SAAS,YAAY,KAAG,iBAanE,CAAC;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,OAAO,UAAW,YAAY,qRAMxC,CAAC"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* `defaultRemovalPolicy: 'retain'`, so removing a declaration does NOT reach `destroyOsd` — a
|
|
12
12
|
* caller opts in with `.pipe(RemovalPolicy.destroy())`.
|
|
13
13
|
*/
|
|
14
|
+
import * as nodes from '@distilled.cloud/proxmox/nodes';
|
|
14
15
|
import * as Effect from 'effect/Effect';
|
|
15
16
|
import type { CephOsdProps } from './ceph-osd.ts';
|
|
16
17
|
import type { EndpointKey } from './constraints.ts';
|
|
@@ -32,7 +33,7 @@ export declare const OSD_CREATE_ENDPOINT: EndpointKey;
|
|
|
32
33
|
* ⚠️ `dev` is `string | undefined` on the props and non-optional here: `createOsd` refuses first.
|
|
33
34
|
*/
|
|
34
35
|
export declare const createOsdForm: (props: CephOsdProps, dev: string) => Record<string, string>;
|
|
35
|
-
export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./ceph-osd-tree.ts").CephOsdAttributes, Error | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
36
|
+
export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./ceph-osd-tree.ts").CephOsdAttributes, Error | import("effect/unstable/http/HttpClientError").HttpClientError | import("./credential-errors.ts").PveCredentialDenied, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
36
37
|
/**
|
|
37
38
|
* ⛔ REMOVING THE DECLARATION REMOVES THE ASSERTION, NOT THE REPLICA, AND THAT ASYMMETRY IS THE
|
|
38
39
|
* POINT. `DELETE /nodes/{node}/ceph/osd/{osdid}` takes a replica out of a live pool — with
|
|
@@ -50,6 +51,20 @@ export declare const createOsd: (news: CephOsdProps) => Effect.Effect<import("./
|
|
|
50
51
|
*
|
|
51
52
|
* ⚠️ `cleanup` DEFAULTS TO FALSE, so the logical volumes survive and the disk can be re-added
|
|
52
53
|
* without a rebuild. Ceph still starts backfilling the missing copies the moment the OSD goes.
|
|
54
|
+
*
|
|
55
|
+
* ⚠️ `cleanup` RIDES A DELETE BODY, ON `client.ts` AND ON DISTILLED ALIKE — PRE-EXISTING, NOT
|
|
56
|
+
* INTRODUCED HERE. `client.ts`'s own `buildRequest` (client.ts) puts `form` in the body for
|
|
57
|
+
* every method, DELETE included, and CHECKED against distilled's generated
|
|
58
|
+
* `DeleteNodeCephOsdRequest`: `cleanup` carries no `T.Query()` annotation either, so it also
|
|
59
|
+
* defaults to a body field. ceph-fs-wire.ts's own ⛔ (measured from PVE's `AnyEvent.pm`) is that
|
|
60
|
+
* PVE's server never reads a body on DELETE — so `cleanup=1` was ALREADY silently ignored by
|
|
61
|
+
* the live cluster before this migration, on the unmigrated code too. Migrating carries the
|
|
62
|
+
* SAME behaviour forward exactly, byte-for-byte, rather than introducing a new gap; unlike
|
|
63
|
+
* `Proxmox.CephFs`'s delete, this is not a reason to keep the call on the hand client. It has
|
|
64
|
+
* zero practical effect today regardless, since the whole DELETE 403s for this package's
|
|
65
|
+
* credential either way (the root-only ⛔ at the top of ceph-osd.ts) — flagged separately as a
|
|
66
|
+
* pre-existing, out-of-scope bug worth its own fix (move `cleanup` into the query string, the
|
|
67
|
+
* way `destroyPath` in ceph-fs-wire.ts already does).
|
|
53
68
|
*/
|
|
54
|
-
export declare const destroyOsd: (olds: CephOsdProps) => Effect.Effect<
|
|
69
|
+
export declare const destroyOsd: (olds: CephOsdProps) => Effect.Effect<string, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
55
70
|
//# sourceMappingURL=ceph-osd-write.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-osd-write.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ceph-osd-write.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAA+C,CAAC;AAIlF;;;GAGG;AACH,eAAO,MAAM,aAAa,UAAW,YAAY,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAGpF,CAAC;AAEH,eAAO,MAAM,SAAS,4QAsCpB,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU,SAAU,YAAY,8PAU1C,CAAC"}
|
|
@@ -33,6 +33,12 @@
|
|
|
33
33
|
* `hf-provision@pve!…` token would likely be answered 403 however wide its role. That is a
|
|
34
34
|
* reason to leave the write lane closed, not something to confirm by trying: if the reasoning
|
|
35
35
|
* is wrong, the confirmation costs a disk.
|
|
36
|
+
*
|
|
37
|
+
* ★ MIGRATED OFF `client.ts` ONTO `@distilled.cloud/proxmox` (2026-09-24, decision 43, 2c) — this
|
|
38
|
+
* file itself never called `pve()` directly, so nothing here changed; ceph-osd-tree.ts's own
|
|
39
|
+
* header has the read side (still no `Effect.orElseSucceed`, unlike every other migrated Ceph
|
|
40
|
+
* family), ceph-osd-write.ts's has the write side and the one pre-existing, out-of-scope gap
|
|
41
|
+
* this migration carries forward rather than fixes.
|
|
36
42
|
*/
|
|
37
43
|
import { Resource } from 'alchemy';
|
|
38
44
|
import * as Provider from 'alchemy/Provider';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-osd.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ceph-osd.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-osd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ,CAC9C,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,iDAEzB,CAAC;AA+HH,eAAO,MAAM,sBAAsB,oIACoD,CAAC"}
|
|
@@ -6,25 +6,32 @@
|
|
|
6
6
|
* synchronous. Ceph's are not — a pool delete returns before the PGs are gone — so this file is
|
|
7
7
|
* the polling that difference forces, and ceph-pool.ts is the declaration.
|
|
8
8
|
*/
|
|
9
|
+
import * as nodes from '@distilled.cloud/proxmox/nodes';
|
|
9
10
|
import * as Effect from 'effect/Effect';
|
|
10
11
|
import type { CephPoolAttributes, CephPoolProps } from './ceph-pool-form.ts';
|
|
11
12
|
import type { PveRequirements } from './resource.ts';
|
|
12
13
|
/**
|
|
13
14
|
* ⚠️ THE DEPENDENCIES ARE PASSED IN RATHER THAN IMPORTED, and that is what made this file
|
|
14
|
-
* separable at all. `
|
|
15
|
-
* ceph-pool.ts; importing
|
|
16
|
-
* definitions of one path. Passing
|
|
15
|
+
* separable at all. `ops.read` — now `readPoolStatus` (ceph-pool-wire.ts) — is a module-level
|
|
16
|
+
* binding in ceph-pool.ts; importing it back would be a runtime cycle, and duplicating it would
|
|
17
|
+
* be two definitions of one path. Passing it is the pattern zfs-pool-write.ts already uses.
|
|
18
|
+
* The error parameter preserves the reader's typed failures through settle; it is not `never`.
|
|
17
19
|
*/
|
|
18
|
-
export type PoolRead = (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined,
|
|
20
|
+
export type PoolRead<E> = (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, E, PveRequirements>;
|
|
19
21
|
/**
|
|
20
|
-
* ⛔ THE GUARD ON THE CREATE.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* An empty list is trusted: the collection
|
|
25
|
-
* filtering, so `[]` really does mean a cluster with no pools.
|
|
22
|
+
* ⛔ THE GUARD ON THE CREATE. The original read folded 403s/timeouts into absence, so this
|
|
23
|
+
* independent index check prevented creating over a live pool. The typed reader now
|
|
24
|
+
* propagates those failures, but a `CephPoolNotFound` must still not override a listed pool:
|
|
25
|
+
* the measured PG-merge risk warrants keeping both observations. Failed index reads also
|
|
26
|
+
* propagate. An empty list is trusted: the collection refuses a narrow role with 403 rather
|
|
27
|
+
* than filtering, so `[]` really does mean a cluster with no pools.
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ `describe` IS STILL A PLAIN STRING (ceph-pool.ts builds it from `object`/`collection` in
|
|
30
|
+
* ceph-pool-form.ts) — this function no longer takes a `collection` PATH, since
|
|
31
|
+
* `nodes.listNodeCephPool` addresses the endpoint itself; the parameter list keeps `describe`
|
|
32
|
+
* only, to name the object in the refusal message.
|
|
26
33
|
*/
|
|
27
|
-
export declare const confirmAbsent: (props: CephPoolProps,
|
|
34
|
+
export declare const confirmAbsent: (props: CephPoolProps, describe: string) => Effect.Effect<void, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
28
35
|
/**
|
|
29
36
|
* Wait for the cluster to agree, then answer the last thing it said.
|
|
30
37
|
*
|
|
@@ -35,5 +42,5 @@ export declare const confirmAbsent: (props: CephPoolProps, collection: string, d
|
|
|
35
42
|
* ⚠️ SHORT POLLS, LOW CAP: 2s apart, 30 tries, about a minute. A pool create takes seconds; one
|
|
36
43
|
* still unsettled after a minute is a fault to surface, not a wait to lengthen.
|
|
37
44
|
*/
|
|
38
|
-
export declare const settle: (props: CephPoolProps, read: PoolRead
|
|
45
|
+
export declare const settle: <E>(props: CephPoolProps, read: PoolRead<E>, done: (live: CephPoolAttributes | undefined) => boolean) => Effect.Effect<CephPoolAttributes | undefined, E, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
39
46
|
//# sourceMappingURL=ceph-pool-settle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-pool-settle.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"ceph-pool-settle.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-settle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CACxB,KAAK,EAAE,aAAa,KACjB,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG,SAAS,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,UAAW,aAAa,YAAY,MAAM,4PAcjE,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SACf,aAAa,QACd,QAAQ,CAAC,CAAC,CAAC,QACX,CAAC,IAAI,EAAE,kBAAkB,GAAG,SAAS,KAAK,OAAO,2GASrD,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Proxmox.CephPool`'s distilled wire lane: the status read, and the two request translations.
|
|
3
|
+
*
|
|
4
|
+
* ★ SPLIT OUT OF ceph-pool-form.ts FOR THE 250-LINE CAP (that file is already near it) — the seam
|
|
5
|
+
* is "touches the cluster or not", the same one ceph-pool-form.ts itself draws against
|
|
6
|
+
* ceph-pool.ts. Nothing in ceph-pool-form.ts changed: `createBody`/`updateBody` still build the
|
|
7
|
+
* PVE form, unaware distilled exists: this file is the ONLY place that translates one into a
|
|
8
|
+
* typed distilled request.
|
|
9
|
+
*
|
|
10
|
+
* ⛔ ONLY TYPED ABSENCE MAY REACH A CREATE. The transport migration deliberately preserved
|
|
11
|
+
* `pveOperations.read`'s catch-all `Effect.orElseSucceed(() => undefined)` to avoid changing
|
|
12
|
+
* behavior during the swap. That also hid refused credentials and transient failures, risking
|
|
13
|
+
* a false update/create. SDK PR #265 added the measured `CephPoolNotFound` tag; the follow-up
|
|
14
|
+
* now catches only it. One reader serves read/diff/reconcile/settle, so all propagate other
|
|
15
|
+
* failures. `confirmAbsent` still checks the index before create: a missing status alone must
|
|
16
|
+
* never override a pool that the index lists (the PG-merge incident, ceph-pool-settle.ts).
|
|
17
|
+
*/
|
|
18
|
+
import * as nodes from '@distilled.cloud/proxmox/nodes';
|
|
19
|
+
import * as Effect from 'effect/Effect';
|
|
20
|
+
import { type CephPoolAttributes, type CephPoolProps } from './ceph-pool-form.ts';
|
|
21
|
+
/**
|
|
22
|
+
* The live pool, or `undefined` only for the SDK's measured `CephPoolNotFound`. The initial
|
|
23
|
+
* transport swap preserved `ops.read`'s catch-all fold; the 2026-09-24 follow-up removes that ambiguity.
|
|
24
|
+
* Read, reconcile and settle now propagate every other failure instead of assuming absence.
|
|
25
|
+
*
|
|
26
|
+
* ⛔ `verbose=1` IS WHAT MAKES `applications` VISIBLE AT ALL — ceph-pool.ts's own header has the
|
|
27
|
+
* measured reason and the cost (two extra, unguarded mon commands PVE runs to answer it).
|
|
28
|
+
*/
|
|
29
|
+
export declare const readPoolStatus: (props: CephPoolProps) => Effect.Effect<CephPoolAttributes | undefined, Error | import("./distilled-pve.ts").PveClusterExhausted | import("./credential-errors.ts").PveCredentialDenied | import("effect/Cause").TimeoutError | nodes.ProxmoxOpError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
30
|
+
/** The two endpoints, as the keys `guardWrite` (distilled-guard.ts) checks both forms against. */
|
|
31
|
+
export declare const CEPH_POOL_CREATE = "pve:POST /nodes/{node}/ceph/pool";
|
|
32
|
+
export declare const CEPH_POOL_UPDATE = "pve:PUT /nodes/{node}/ceph/pool/{name}";
|
|
33
|
+
/** The actual `createNodeCephPool` call body — `createBody`, translated. No field is renamed. */
|
|
34
|
+
export declare const toDistilledCreate: (props: CephPoolProps) => nodes.CreateNodeCephPoolRequest;
|
|
35
|
+
/** The actual `putNodeCephPool` call body — `updateBody`, translated. No field is renamed. */
|
|
36
|
+
export declare const toDistilledUpdate: (props: CephPoolProps) => nodes.PutNodeCephPoolRequest;
|
|
37
|
+
//# sourceMappingURL=ceph-pool-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ceph-pool-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool-wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,KAAK,MAAM,gCAAgC,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAqC7B;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,sRAShD,CAAC;AAEJ,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,qCAAqC,CAAC;AACnE,eAAO,MAAM,gBAAgB,2CAA2C,CAAC;AAEzE,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,yBAIb,CAAC;AAEnD,8FAA8F;AAC9F,eAAO,MAAM,iBAAiB,UAAW,aAAa,KAAG,KAAK,CAAC,sBAKhB,CAAC"}
|
|
@@ -5,11 +5,16 @@
|
|
|
5
5
|
* ⛔ IT DOES NOT USE `pveHandlers`, AND THE REASON IS MEASURED RATHER THAN STYLISTIC: THE READ AND
|
|
6
6
|
* THE WRITES SIT AT DIFFERENT PATHS. `GET /nodes/{node}/ceph/pool/{name}` is `poolindex` and
|
|
7
7
|
* answers `[{"name":"status"}]` — an INDEX OF CHILDREN, not the pool. The pool is one level
|
|
8
|
-
* further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
8
|
+
* further down, at `.../status` (`getpool`), which accepts no PUT and no DELETE. Every handler
|
|
9
|
+
* below is hand-written for that reason, on `client.ts` and now on distilled alike — acl.ts is
|
|
10
|
+
* the precedent for hand-writing over the factory.
|
|
11
|
+
*
|
|
12
|
+
* ★ MIGRATED OFF `client.ts`'s generic `pve()` ONTO `@distilled.cloud/proxmox`'s typed
|
|
13
|
+
* `nodes.getNodeCephPoolStatus`/`createNodeCephPool`/`putNodeCephPool`/`deleteNodeCephPool`/
|
|
14
|
+
* `listNodeCephPool` (2026-09-24, decision 43's walk-down, 2c). `distilled-pve.ts`'s `runPve`
|
|
15
|
+
* replaces `pve()`; `readPoolStatus` (ceph-pool-wire.ts) keeps the SAME single-fold shape this
|
|
16
|
+
* family always had — see that file's own header for why this migration does not also add the
|
|
17
|
+
* newer dual-path pattern `Proxmox.NodeNetwork` carries.
|
|
13
18
|
*
|
|
14
19
|
* ⛔ A CREATE FIRED AT A POOL THAT ALREADY EXISTS IS NOT A NO-OP, IT IS A PG MERGE — the second ⛔
|
|
15
20
|
* in ceph-pool-form.ts has the evidence, and `confirmAbsent` below is the guard that stops it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ceph-pool.d.ts","sourceRoot":"","sources":["../../src/proxmox/ceph-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAMnB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAElD,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAC/C,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,eAAe,CAChB;CAAG;AAEJ,kGAAkG;AAClG,eAAO,MAAM,eAAe,kDAE1B,CAAC;AAqBH,eAAO,MAAM,uBAAuB,qIAkHjC,CAAC"}
|
|
@@ -48,21 +48,16 @@ export declare const matches: (attributes: GroupAttributes, props: GroupProps) =
|
|
|
48
48
|
* release that does answer `{}`, but this function is what actually carries the "not found"
|
|
49
49
|
* case, as a thrown error — `readGroup` below is the one that folds it.
|
|
50
50
|
*/
|
|
51
|
-
export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
51
|
+
export declare const readGroupOrFail: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | access.GroupNotFound | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
52
52
|
/**
|
|
53
|
-
* ⛔
|
|
54
|
-
* PVE
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* ⛔ `group.ts`'s `diff` does **NOT** use this — found 2026-09-24, the SAME bug class as the
|
|
60
|
-
* credential denial fix: folding a TRANSIENT failure (a `PveClusterExhausted`, the encoding bug
|
|
61
|
-
* above) into "absent" at PLAN TIME is exactly what forced a false `update` with nothing
|
|
62
|
-
* compared. `diff` calls `readGroupOrFail` directly instead, so a genuine failure there
|
|
63
|
-
* propagates and fails the whole plan loudly — never silently misreports one row.
|
|
53
|
+
* ⛔ ONLY `GroupNotFound` MEANS ABSENT. The initial distilled transport swap preserved a
|
|
54
|
+
* catch-all fold because PVE reports missing objects as HTTP 500. SDK PR 265 now types that
|
|
55
|
+
* measured message, so permission errors, unrelated 500s and exhausted transports propagate
|
|
56
|
+
* instead of triggering a speculative create (decision 49 follow-up, 2026-09-24).
|
|
57
|
+
* ★ `readGroupOrFail` remains the strict path used for an already-confirmed state row. This
|
|
58
|
+
* change narrows cold reads/reconcile without changing that existing drift/diff contract.
|
|
64
59
|
*/
|
|
65
|
-
export declare const readGroup: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined,
|
|
60
|
+
export declare const readGroup: (props: GroupProps) => Effect.Effect<typeof UNREADABLE | GroupAttributes | undefined, import("@distilled.cloud/caddy").BadGateway | import("@distilled.cloud/caddy").BadRequest | import("@distilled.cloud/caddy").ConfigError | Error | import("@distilled.cloud/caddy").GatewayTimeout | import("effect/unstable/http/HttpClientError").HttpClientError | import("@distilled.cloud/caddy").InternalServerError | import("@distilled.cloud/proxmox/Errors").ParameterVerificationFailed | import("@distilled.cloud/proxmox/Errors").ProxmoxParseError | import("./distilled-pve.ts").PveClusterExhausted | import("@distilled.cloud/caddy").ServiceUnavailable | import("effect/Cause").TimeoutError | import("@distilled.cloud/caddy").TooManyRequests | import("@distilled.cloud/caddy").Unauthorized | import("@distilled.cloud/proxmox/Errors").UnknownProxmoxError, import("effect/unstable/http/HttpClient").HttpClient>;
|
|
66
61
|
/** `read`/`reconcile` return `Attributes | undefined`; only `diff` tells `UNREADABLE` apart. */
|
|
67
62
|
export declare const dropUnreadable: (live: GroupAttributes | Unreadable | undefined) => GroupAttributes | undefined;
|
|
68
63
|
//# sourceMappingURL=group-wire.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,
|
|
1
|
+
{"version":3,"file":"group-wire.d.ts","sourceRoot":"","sources":["../../src/proxmox/group-wire.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,iCAAiC,CAAC;AAC1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AAGrF,eAAO,MAAM,YAAY,4BAA4B,CAAC;AACtD,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,YAAa,MAAM,GAAG,SAAS,WAGxD,CAAC;AAQF,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,wBAGpD,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,MAAM,CAAC,qBAGpD,CAAC;AAaH;;;GAGG;AACH,eAAO,MAAM,OAAO,eAAgB,eAAe,SAAS,UAAU,YACjB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,UAAW,UAAU,o4BAW9C,CAAC;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,UAAW,UAAU,62BACqD,CAAC;AAEjG,gGAAgG;AAChG,eAAO,MAAM,cAAc,SAAU,eAAe,GAAG,UAAU,GAAG,SAAS,gCACrC,CAAC"}
|