@homeflare/alchemy 0.40.0 → 0.42.0
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/dist/caddy/index.js.map +2 -2
- package/dist/ceph/index.js +2 -1
- package/dist/ceph/index.js.map +3 -3
- package/dist/launchd/fake-runner.d.ts.map +1 -1
- package/dist/launchd/index.d.ts +1 -1
- package/dist/launchd/index.d.ts.map +1 -1
- package/dist/launchd/index.js +7 -1
- package/dist/launchd/index.js.map +5 -5
- package/dist/launchd/local-runner.d.ts.map +1 -1
- package/dist/launchd/runner.d.ts +21 -0
- package/dist/launchd/runner.d.ts.map +1 -1
- package/dist/launchd/sudo-runner.d.ts.map +1 -1
- package/dist/linux/directory-lifecycle.d.ts.map +1 -1
- package/dist/linux/fake-linux-host.d.ts.map +1 -1
- package/dist/linux/index.d.ts +1 -1
- package/dist/linux/index.d.ts.map +1 -1
- package/dist/linux/index.js +16 -4
- package/dist/linux/index.js.map +7 -7
- package/dist/linux/ssh-runner.d.ts.map +1 -1
- package/dist/linux/sudo-runner.d.ts.map +1 -1
- package/dist/opnsense/alias-form.d.ts +14 -1
- package/dist/opnsense/alias-form.d.ts.map +1 -1
- package/dist/opnsense/alias.d.ts +1 -1
- package/dist/opnsense/alias.d.ts.map +1 -1
- package/dist/opnsense/group-form.d.ts +8 -2
- package/dist/opnsense/group-form.d.ts.map +1 -1
- package/dist/opnsense/group.d.ts +1 -1
- package/dist/opnsense/group.d.ts.map +1 -1
- package/dist/opnsense/index.js +15 -7
- package/dist/opnsense/index.js.map +7 -7
- package/dist/opnsense/wire.d.ts +42 -12
- package/dist/opnsense/wire.d.ts.map +1 -1
- package/dist/proxmox/acl.d.ts.map +1 -1
- package/dist/proxmox/api-token.d.ts.map +1 -1
- package/dist/proxmox/credential-errors.d.ts +18 -4
- package/dist/proxmox/credential-errors.d.ts.map +1 -1
- package/dist/proxmox/credentials.d.ts +35 -1
- package/dist/proxmox/credentials.d.ts.map +1 -1
- package/dist/proxmox/group.d.ts.map +1 -1
- package/dist/proxmox/index.js +81 -51
- package/dist/proxmox/index.js.map +19 -17
- package/dist/proxmox/lease-cache.d.ts +67 -5
- package/dist/proxmox/lease-cache.d.ts.map +1 -1
- package/dist/proxmox/mint.d.ts +4 -2
- package/dist/proxmox/mint.d.ts.map +1 -1
- package/dist/proxmox/node-network.d.ts.map +1 -1
- package/dist/proxmox/role.d.ts.map +1 -1
- package/dist/proxmox/storage-form.d.ts +28 -3
- package/dist/proxmox/storage-form.d.ts.map +1 -1
- package/dist/proxmox/storage-plugin-options.d.ts +2 -0
- package/dist/proxmox/storage-plugin-options.d.ts.map +1 -0
- package/dist/proxmox/storage-wire.d.ts +28 -1
- package/dist/proxmox/storage-wire.d.ts.map +1 -1
- package/dist/proxmox/storage.d.ts +6 -1
- package/dist/proxmox/storage.d.ts.map +1 -1
- package/dist/proxmox/unreadable-read.d.ts +8 -1
- package/dist/proxmox/unreadable-read.d.ts.map +1 -1
- package/dist/proxmox/user.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool.d.ts.map +1 -1
- package/dist/release/index.d.ts +1 -1
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js.map +2 -2
- package/docs/credentials.md +14 -1
- package/docs/distilled-interim.md +7 -0
- package/docs/launchd.md +5 -3
- package/docs/provider-standard.md +5 -1
- package/docs/talos-argocd-dogfood.md +160 -0
- package/package.json +2 -2
- package/src/launchd/fake-runner.ts +2 -0
- package/src/launchd/index.ts +8 -1
- package/src/launchd/local-runner.ts +16 -1
- package/src/launchd/runner.ts +22 -0
- package/src/launchd/sudo-runner.ts +3 -0
- package/src/linux/directory-lifecycle.ts +18 -3
- package/src/linux/directory-sudo.test.ts +59 -0
- package/src/linux/directory.test.ts +34 -8
- package/src/linux/fake-linux-host.ts +2 -0
- package/src/linux/index.ts +1 -0
- package/src/linux/ssh-runner.ts +4 -0
- package/src/linux/sudo-runner.ts +3 -0
- package/src/opnsense/alias-form.test.ts +24 -12
- package/src/opnsense/alias-form.ts +20 -7
- package/src/opnsense/alias.test.ts +13 -6
- package/src/opnsense/alias.ts +16 -10
- package/src/opnsense/group-form.test.ts +12 -8
- package/src/opnsense/group-form.ts +13 -4
- package/src/opnsense/group.test.ts +18 -7
- package/src/opnsense/group.ts +10 -3
- package/src/opnsense/wire.ts +57 -12
- package/src/proxmox/acl.ts +7 -1
- package/src/proxmox/api-token.ts +7 -1
- package/src/proxmox/credential-errors.ts +19 -5
- package/src/proxmox/credentials.test.ts +73 -1
- package/src/proxmox/credentials.ts +72 -1
- package/src/proxmox/group.ts +7 -1
- package/src/proxmox/lease-cache-mint.test.ts +70 -0
- package/src/proxmox/lease-cache.test.ts +83 -7
- package/src/proxmox/lease-cache.ts +74 -10
- package/src/proxmox/mint.ts +12 -5
- package/src/proxmox/node-network.ts +7 -1
- package/src/proxmox/role.ts +7 -1
- package/src/proxmox/storage-form.ts +48 -8
- package/src/proxmox/storage-plugin-options.ts +45 -0
- package/src/proxmox/storage-update.test.ts +183 -0
- package/src/proxmox/storage-wire.ts +54 -7
- package/src/proxmox/storage.ts +25 -7
- package/src/proxmox/unreadable-read.ts +16 -4
- package/src/proxmox/user.ts +7 -1
- package/src/proxmox/zfs-pool.ts +7 -1
- package/src/release/index.ts +1 -0
package/dist/proxmox/index.js
CHANGED
|
@@ -1025,6 +1025,20 @@ import * as Duration from "effect/Duration";
|
|
|
1025
1025
|
import * as Effect3 from "effect/Effect";
|
|
1026
1026
|
import * as Exit from "effect/Exit";
|
|
1027
1027
|
|
|
1028
|
+
// src/proxmox/credentials.ts
|
|
1029
|
+
var VALID_TIER = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
1030
|
+
var mintTier = (target, role) => {
|
|
1031
|
+
if (target.scheme !== "pve")
|
|
1032
|
+
return role;
|
|
1033
|
+
const tier = target.roles?.[role];
|
|
1034
|
+
if (tier === undefined)
|
|
1035
|
+
return role;
|
|
1036
|
+
if (!VALID_TIER.test(tier)) {
|
|
1037
|
+
throw new Error(`PveTarget.roles.${role} = ${JSON.stringify(tier)} is not a valid OpenBao tier name -- ` + 'it would be interpolated straight into "<mount>/creds/<tier>" and must be a plain name ' + '(letters, digits, ".", "_", "-", not starting with one of those and not "..").');
|
|
1038
|
+
}
|
|
1039
|
+
return tier;
|
|
1040
|
+
};
|
|
1041
|
+
|
|
1028
1042
|
// src/proxmox/mint.ts
|
|
1029
1043
|
import * as Effect2 from "effect/Effect";
|
|
1030
1044
|
import * as Option from "effect/Option";
|
|
@@ -1038,14 +1052,15 @@ import * as Data from "effect/Data";
|
|
|
1038
1052
|
|
|
1039
1053
|
class PveCredentialDenied extends Data.TaggedError("PveCredentialDenied") {
|
|
1040
1054
|
get message() {
|
|
1041
|
-
return `OpenBao GET /v1/${this.mount}/creds/${this.
|
|
1055
|
+
return `OpenBao GET /v1/${this.mount}/creds/${this.tier} -> 403: ${this.detail}. This identity's ` + "AppRole has no grant for this role -- a refused read, not evidence the object is gone.";
|
|
1042
1056
|
}
|
|
1043
1057
|
}
|
|
1044
1058
|
|
|
1045
1059
|
// src/proxmox/mint.ts
|
|
1046
1060
|
var baoVariable = (env, name) => env[`BAO_${name}`] ?? env[`VAULT_${name}`] ?? "";
|
|
1047
1061
|
var mint = (target, role, env = process.env) => Effect2.gen(function* () {
|
|
1048
|
-
const
|
|
1062
|
+
const tier = mintTier(target, role);
|
|
1063
|
+
const path = `${target.mount}/creds/${tier}`;
|
|
1049
1064
|
const refuse = (status2, detail) => new Error(`OpenBao GET /v1/${path} -> ${status2 === 0 ? "no response" : status2}: ${detail}`);
|
|
1050
1065
|
const address = baoVariable(env, "AGENT_ADDR") || baoVariable(env, "ADDR") || "https://127.0.0.1:8200";
|
|
1051
1066
|
const socket = address.startsWith("unix://") ? address.slice("unix://".length) : undefined;
|
|
@@ -1078,14 +1093,14 @@ var mint = (target, role, env = process.env) => Effect2.gen(function* () {
|
|
|
1078
1093
|
const isOpenBaoBody = Array.isArray(errors);
|
|
1079
1094
|
const detail = isOpenBaoBody ? errors.map(String).join("; ") : "not an OpenBao error body";
|
|
1080
1095
|
if (status === 403 && isOpenBaoBody) {
|
|
1081
|
-
return yield* Effect2.fail(new PveCredentialDenied({ detail, mount: target.mount,
|
|
1096
|
+
return yield* Effect2.fail(new PveCredentialDenied({ detail, mount: target.mount, tier }));
|
|
1082
1097
|
}
|
|
1083
1098
|
return yield* Effect2.fail(refuse(status, detail || "(no errors given)"));
|
|
1084
1099
|
}
|
|
1085
1100
|
const tokenId = parsed?.data?.token_id;
|
|
1086
1101
|
const secret = parsed?.data?.secret;
|
|
1087
1102
|
if (typeof tokenId !== "string" || typeof secret !== "string") {
|
|
1088
|
-
return yield* Effect2.fail(new Error(`${target.mount}/creds/${
|
|
1103
|
+
return yield* Effect2.fail(new Error(`${target.mount}/creds/${tier} returned no token_id/secret. Either this approle lacks ` + `the grant, or the mount is not ${target.mount}. Say which mount and role you needed ` + `than falling back to a stored credential -- every stored PVE token is read-only.`));
|
|
1089
1104
|
}
|
|
1090
1105
|
const lease = parsed?.lease_duration;
|
|
1091
1106
|
const leaseSeconds = typeof lease === "number" ? lease : 0;
|
|
@@ -1097,13 +1112,14 @@ var authorization = (credential, target) => target.scheme === "pbs" ? `PBSAPITok
|
|
|
1097
1112
|
var REMINT_MARGIN_SECONDS = 60;
|
|
1098
1113
|
var keyOf = (target, role) => ({
|
|
1099
1114
|
mount: target.mount,
|
|
1100
|
-
|
|
1101
|
-
|
|
1115
|
+
scheme: target.scheme,
|
|
1116
|
+
tier: mintTier(target, role)
|
|
1102
1117
|
});
|
|
1103
1118
|
var timeToLive = (exit) => Exit.isSuccess(exit) && exit.value.leaseSeconds > REMINT_MARGIN_SECONDS ? Duration.seconds(exit.value.leaseSeconds - REMINT_MARGIN_SECONDS) : Duration.zero;
|
|
1104
1119
|
var makeLeases = (mintFor) => Cache.makeWith(mintFor, { capacity: 64, requireServicesAt: "lookup", timeToLive });
|
|
1105
|
-
var targetForKey = (key) => key.scheme === "pbs" ? { api: "https://pbs.invalid/api2/json", mount: key.mount, scheme: "pbs" } : { members: [], mount: key.mount, scheme: "pve" };
|
|
1106
|
-
var
|
|
1120
|
+
var targetForKey = (key) => key.scheme === "pbs" ? { api: "https://pbs.invalid/api2/json", mount: key.mount, scheme: "pbs" } : { members: [], mount: key.mount, roles: { read: key.tier }, scheme: "pve" };
|
|
1121
|
+
var mintForKey = (key, env = process.env) => mint(targetForKey(key), key.scheme === "pbs" ? key.tier : "read", env);
|
|
1122
|
+
var leases = Effect3.runSync(makeLeases(mintForKey));
|
|
1107
1123
|
var leased = (target, role) => Cache.get(leases, keyOf(target, role));
|
|
1108
1124
|
|
|
1109
1125
|
// src/proxmox/members.ts
|
|
@@ -1233,7 +1249,7 @@ var runPve = (target, role, isWrite, op) => Effect5.gen(function* () {
|
|
|
1233
1249
|
import * as Effect6 from "effect/Effect";
|
|
1234
1250
|
var UNREADABLE = Symbol("pve-unreadable");
|
|
1235
1251
|
var readOrUnreadable = (effect) => effect.pipe(Effect6.catchTag("PveCredentialDenied", () => Effect6.succeed(UNREADABLE)));
|
|
1236
|
-
var unreadableWarning = (type, identity2) => Effect6.logWarning(`${type} ${identity2}: the read was refused (no grant for this credential's role) --
|
|
1252
|
+
var unreadableWarning = (type, identity2, mount, tier) => Effect6.logWarning(`${type} ${identity2}: the read of ${mount}/creds/${tier} was refused (no grant for this ` + "credential's role) -- reporting noop rather than forcing an update with nothing compared. " + "Re-plan on a lane that can read this object before trusting this row.");
|
|
1237
1253
|
|
|
1238
1254
|
// src/proxmox/acl.ts
|
|
1239
1255
|
var ProxmoxAcl = Resource("Proxmox.Acl");
|
|
@@ -1255,7 +1271,7 @@ var ProxmoxAclProvider = () => Provider.effect(ProxmoxAcl, Effect7.succeed(Proxm
|
|
|
1255
1271
|
return;
|
|
1256
1272
|
const live = yield* readAttributes(news);
|
|
1257
1273
|
if (live === UNREADABLE) {
|
|
1258
|
-
yield* unreadableWarning("Proxmox.Acl", identity(news));
|
|
1274
|
+
yield* unreadableWarning("Proxmox.Acl", identity(news), news.target.mount, mintTier(news.target, "provision"));
|
|
1259
1275
|
return { action: "noop" };
|
|
1260
1276
|
}
|
|
1261
1277
|
return live !== undefined && matches(live, news) ? { action: "noop" } : { action: "update" };
|
|
@@ -1425,7 +1441,7 @@ var ProxmoxApiTokenProvider = () => Provider2.effect(ProxmoxApiToken, Effect8.su
|
|
|
1425
1441
|
return;
|
|
1426
1442
|
const live = yield* readToken(news);
|
|
1427
1443
|
if (live === UNREADABLE) {
|
|
1428
|
-
yield* unreadableWarning("Proxmox.ApiToken", `${news.userid}!${news.tokenid}
|
|
1444
|
+
yield* unreadableWarning("Proxmox.ApiToken", `${news.userid}!${news.tokenid}`, news.target.mount, mintTier(news.target, "provision"));
|
|
1429
1445
|
return { action: "noop" };
|
|
1430
1446
|
}
|
|
1431
1447
|
return live !== undefined && matches2(live, news) ? { action: "noop" } : { action: "update" };
|
|
@@ -2393,7 +2409,7 @@ var ProxmoxGroupProvider = () => Provider10.effect(ProxmoxGroup, Effect28.succee
|
|
|
2393
2409
|
return;
|
|
2394
2410
|
const live = yield* readGroupOrFail(news);
|
|
2395
2411
|
if (live === UNREADABLE) {
|
|
2396
|
-
yield* unreadableWarning("Proxmox.Group", news.groupid);
|
|
2412
|
+
yield* unreadableWarning("Proxmox.Group", news.groupid, news.target.mount, mintTier(news.target, "read"));
|
|
2397
2413
|
return { action: "noop" };
|
|
2398
2414
|
}
|
|
2399
2415
|
if (live === undefined) {
|
|
@@ -3866,7 +3882,7 @@ var ProxmoxNodeNetworkProvider = () => Provider16.effect(ProxmoxNodeNetwork, Eff
|
|
|
3866
3882
|
return;
|
|
3867
3883
|
const live = yield* readInterfaceOrFail(news);
|
|
3868
3884
|
if (live === UNREADABLE) {
|
|
3869
|
-
yield* unreadableWarning("Proxmox.NodeNetwork", `${news.node}/${news.iface}
|
|
3885
|
+
yield* unreadableWarning("Proxmox.NodeNetwork", `${news.node}/${news.iface}`, news.target.mount, mintTier(news.target, "read"));
|
|
3870
3886
|
return { action: "noop" };
|
|
3871
3887
|
}
|
|
3872
3888
|
if (live === undefined) {
|
|
@@ -5801,7 +5817,7 @@ var ProxmoxRoleProvider = () => Provider26.effect(ProxmoxRole, Effect78.succeed(
|
|
|
5801
5817
|
return;
|
|
5802
5818
|
const live = yield* readRole(news);
|
|
5803
5819
|
if (live === UNREADABLE) {
|
|
5804
|
-
yield* unreadableWarning("Proxmox.Role", news.roleid);
|
|
5820
|
+
yield* unreadableWarning("Proxmox.Role", news.roleid, news.target.mount, mintTier(news.target, "read"));
|
|
5805
5821
|
return { action: "noop" };
|
|
5806
5822
|
}
|
|
5807
5823
|
if (live === undefined) {
|
|
@@ -5901,7 +5917,7 @@ var ProxmoxUserProvider = () => Provider27.effect(ProxmoxUser, Effect80.succeed(
|
|
|
5901
5917
|
return;
|
|
5902
5918
|
const live = yield* readUserOrFail(news);
|
|
5903
5919
|
if (live === UNREADABLE) {
|
|
5904
|
-
yield* unreadableWarning("Proxmox.User", news.userid);
|
|
5920
|
+
yield* unreadableWarning("Proxmox.User", news.userid, news.target.mount, mintTier(news.target, "read"));
|
|
5905
5921
|
return { action: "noop" };
|
|
5906
5922
|
}
|
|
5907
5923
|
if (live === undefined) {
|
|
@@ -6904,33 +6920,9 @@ import * as Provider35 from "alchemy/Provider";
|
|
|
6904
6920
|
import * as storage2 from "@distilled.cloud/proxmox/storage";
|
|
6905
6921
|
import * as Effect97 from "effect/Effect";
|
|
6906
6922
|
|
|
6907
|
-
// src/proxmox/storage-
|
|
6908
|
-
var
|
|
6909
|
-
var
|
|
6910
|
-
var field6 = (name, value) => value === undefined ? {} : { [name]: value };
|
|
6911
|
-
var locatorForm = (locator) => ({ ...locator });
|
|
6912
|
-
var underscored = (form2) => Object.fromEntries(Object.entries(form2).map(([key, value]) => [key.replaceAll("-", "_"), value]));
|
|
6913
|
-
var mutable2 = (props) => ({
|
|
6914
|
-
...field6("comment", props.comment),
|
|
6915
|
-
...field6("content", props.content),
|
|
6916
|
-
...field6("disable", flag(props.disable)),
|
|
6917
|
-
...field6("nodes", props.nodes),
|
|
6918
|
-
...field6("preallocation", props.preallocation),
|
|
6919
|
-
...field6("prune-backups", props["prune-backups"]),
|
|
6920
|
-
...field6("shared", flag(props.shared))
|
|
6921
|
-
});
|
|
6922
|
-
var createForm11 = (props) => ({
|
|
6923
|
-
...locatorForm(props.locator),
|
|
6924
|
-
...mutable2(props),
|
|
6925
|
-
storage: props.storage,
|
|
6926
|
-
type: props.type
|
|
6927
|
-
});
|
|
6928
|
-
var updateForm9 = (props) => ({
|
|
6929
|
-
...mutable2(props),
|
|
6930
|
-
storage: props.storage
|
|
6931
|
-
});
|
|
6932
|
-
var toDistilledCreate4 = (props) => underscored(createForm11(props));
|
|
6933
|
-
var toDistilledUpdate3 = (props) => underscored(updateForm9(props));
|
|
6923
|
+
// src/proxmox/storage-plugin-options.ts
|
|
6924
|
+
var SHARED_ACCEPTED_TYPES = new Set(["dir", "lvm", "btrfs", "esxi"]);
|
|
6925
|
+
var sharedAccepted = (type) => SHARED_ACCEPTED_TYPES.has(type);
|
|
6934
6926
|
|
|
6935
6927
|
// src/proxmox/storage-wire.ts
|
|
6936
6928
|
import * as storage from "@distilled.cloud/proxmox/storage";
|
|
@@ -6956,7 +6948,44 @@ var attributesOf10 = (live, props) => {
|
|
|
6956
6948
|
var readStorageOrFail = (props) => readOrUnreadable(runPve(props.target, "provision", false, storage.getStorage({ storage: props.storage }))).pipe(Effect96.map((live) => live === UNREADABLE ? UNREADABLE : attributesOf10(live, props)));
|
|
6957
6949
|
var readStorage = (props) => readStorageOrFail(props).pipe(Effect96.catchTag("StorageNotFound", () => Effect96.succeed(undefined)));
|
|
6958
6950
|
var dropUnreadable7 = (live) => live === UNREADABLE ? undefined : live;
|
|
6959
|
-
var
|
|
6951
|
+
var changedProps = (live, props) => ({
|
|
6952
|
+
...sameList2(props.content, live.content) ? {} : { content: props.content },
|
|
6953
|
+
...sameList2(props.nodes, live.nodes) ? {} : { nodes: props.nodes },
|
|
6954
|
+
...sameList2(props["prune-backups"], live["prune-backups"]) ? {} : { "prune-backups": props["prune-backups"] },
|
|
6955
|
+
...same7(props.disable, live.disable) ? {} : { disable: props.disable },
|
|
6956
|
+
...sharedAccepted(props.type) && !same7(props.shared, live.shared) ? { shared: props.shared } : {},
|
|
6957
|
+
...same7(props.preallocation, live.preallocation) ? {} : { preallocation: props.preallocation },
|
|
6958
|
+
...same7(props.comment, live.comment) ? {} : { comment: props.comment }
|
|
6959
|
+
});
|
|
6960
|
+
var matches10 = (attributes2, props) => !sharedAccepted(props.type) && !same7(props.shared, attributes2.shared) ? Effect96.die(new Error(`storage/${props.storage}: declared shared: ${String(props.shared)}, but PVE reports ` + `${String(attributes2.shared)} and '${props.type}' storages never accept a 'shared' ` + "write (storage-plugin-options.ts) -- remove the declared shared or set it to match " + "what PVE already reports; this value can never be applied.")) : Effect96.succeed(Object.keys(changedProps(attributes2, props)).length === 0);
|
|
6961
|
+
|
|
6962
|
+
// src/proxmox/storage-form.ts
|
|
6963
|
+
var STORAGE_CREATE = "pve:POST /storage";
|
|
6964
|
+
var STORAGE_UPDATE = "pve:PUT /storage/{storage}";
|
|
6965
|
+
var field6 = (name, value) => value === undefined ? {} : { [name]: value };
|
|
6966
|
+
var locatorForm = (locator) => ({ ...locator });
|
|
6967
|
+
var underscored = (form2) => Object.fromEntries(Object.entries(form2).map(([key, value]) => [key.replaceAll("-", "_"), value]));
|
|
6968
|
+
var mutable2 = (type, props) => ({
|
|
6969
|
+
...field6("comment", props.comment),
|
|
6970
|
+
...field6("content", props.content),
|
|
6971
|
+
...field6("disable", flag(props.disable)),
|
|
6972
|
+
...field6("nodes", props.nodes),
|
|
6973
|
+
...field6("preallocation", props.preallocation),
|
|
6974
|
+
...field6("prune-backups", props["prune-backups"]),
|
|
6975
|
+
...sharedAccepted(type) ? field6("shared", flag(props.shared)) : {}
|
|
6976
|
+
});
|
|
6977
|
+
var createForm11 = (props) => ({
|
|
6978
|
+
...locatorForm(props.locator),
|
|
6979
|
+
...mutable2(props.type, props),
|
|
6980
|
+
storage: props.storage,
|
|
6981
|
+
type: props.type
|
|
6982
|
+
});
|
|
6983
|
+
var updateForm9 = (props, live) => ({
|
|
6984
|
+
...mutable2(props.type, live === undefined ? props : changedProps(live, props)),
|
|
6985
|
+
storage: props.storage
|
|
6986
|
+
});
|
|
6987
|
+
var toDistilledCreate4 = (props) => underscored(createForm11(props));
|
|
6988
|
+
var toDistilledUpdate3 = (form2) => underscored(form2);
|
|
6960
6989
|
|
|
6961
6990
|
// src/proxmox/storage.ts
|
|
6962
6991
|
var ProxmoxStorage = Resource35("Proxmox.Storage", {
|
|
@@ -6971,28 +7000,29 @@ var ProxmoxStorageProvider = () => Provider35.effect(ProxmoxStorage, Effect97.su
|
|
|
6971
7000
|
if (!isResolved30(news))
|
|
6972
7001
|
return;
|
|
6973
7002
|
yield* guardWrite2(STORAGE_CREATE, createForm11(news), output === undefined);
|
|
6974
|
-
yield* guardWrite2(STORAGE_UPDATE, updateForm9(news), false);
|
|
7003
|
+
yield* guardWrite2(STORAGE_UPDATE, updateForm9(news, undefined), false);
|
|
6975
7004
|
if (output === undefined)
|
|
6976
7005
|
return;
|
|
6977
7006
|
const live = yield* readStorageOrFail(news);
|
|
6978
7007
|
if (live === UNREADABLE) {
|
|
6979
|
-
yield* unreadableWarning("Proxmox.Storage", news.storage);
|
|
7008
|
+
yield* unreadableWarning("Proxmox.Storage", news.storage, news.target.mount, mintTier(news.target, "provision"));
|
|
6980
7009
|
return { action: "noop" };
|
|
6981
7010
|
}
|
|
6982
7011
|
if (live === undefined) {
|
|
6983
7012
|
yield* guardWrite2(STORAGE_CREATE, createForm11(news), true);
|
|
6984
7013
|
return { action: "update" };
|
|
6985
7014
|
}
|
|
6986
|
-
return matches10(live, news) ? { action: "noop" } : { action: "update" };
|
|
7015
|
+
return (yield* matches10(live, news)) ? { action: "noop" } : { action: "update" };
|
|
6987
7016
|
}),
|
|
6988
7017
|
reconcile: Effect97.fn(function* ({ news }) {
|
|
6989
7018
|
const before = dropUnreadable7(yield* readStorage(news));
|
|
6990
7019
|
yield* guardWrite2(STORAGE_CREATE, createForm11(news), before === undefined);
|
|
6991
|
-
|
|
7020
|
+
const update2 = updateForm9(news, before);
|
|
7021
|
+
yield* guardWrite2(STORAGE_UPDATE, update2, false);
|
|
6992
7022
|
if (before === undefined) {
|
|
6993
7023
|
yield* runPve(news.target, "provision", true, storage2.createStorage(toDistilledCreate4(news)));
|
|
6994
|
-
} else if (!matches10(before, news)) {
|
|
6995
|
-
yield* runPve(news.target, "provision", true, storage2.putStorage(toDistilledUpdate3(
|
|
7024
|
+
} else if (!(yield* matches10(before, news))) {
|
|
7025
|
+
yield* runPve(news.target, "provision", true, storage2.putStorage(toDistilledUpdate3(update2)));
|
|
6996
7026
|
}
|
|
6997
7027
|
const after = dropUnreadable7(yield* readStorage(news));
|
|
6998
7028
|
if (after === undefined) {
|
|
@@ -7098,7 +7128,7 @@ var ProxmoxZfsPoolProvider = () => Provider36.effect(ProxmoxZfsPool, Effect100.s
|
|
|
7098
7128
|
return;
|
|
7099
7129
|
const live = yield* readPoolOrFail(news);
|
|
7100
7130
|
if (live === UNREADABLE) {
|
|
7101
|
-
yield* unreadableWarning("Proxmox.ZfsPool", `${news.node}/${news.name}
|
|
7131
|
+
yield* unreadableWarning("Proxmox.ZfsPool", `${news.node}/${news.name}`, news.target.mount, mintTier(news.target, "read"));
|
|
7102
7132
|
return { action: "noop" };
|
|
7103
7133
|
}
|
|
7104
7134
|
if (live === undefined) {
|
|
@@ -7193,5 +7223,5 @@ export {
|
|
|
7193
7223
|
violations
|
|
7194
7224
|
};
|
|
7195
7225
|
|
|
7196
|
-
//# debugId=
|
|
7226
|
+
//# debugId=71934628F9E3FB7664756E2164756E21
|
|
7197
7227
|
//# sourceMappingURL=index.js.map
|