@homeflare/alchemy 0.14.0 → 0.19.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/README.md +29 -0
- package/dist/linux/directory-lifecycle.d.ts +50 -0
- package/dist/linux/directory-lifecycle.d.ts.map +1 -0
- package/dist/linux/directory.d.ts +19 -0
- package/dist/linux/directory.d.ts.map +1 -0
- package/dist/linux/fake-linux-host.d.ts +35 -0
- package/dist/linux/fake-linux-host.d.ts.map +1 -0
- package/dist/linux/fake-systemd.d.ts +34 -0
- package/dist/linux/fake-systemd.d.ts.map +1 -0
- package/dist/linux/index.d.ts +27 -0
- package/dist/linux/index.d.ts.map +1 -0
- package/dist/linux/index.js +1554 -0
- package/dist/linux/index.js.map +37 -0
- package/dist/linux/providers.d.ts +17 -0
- package/dist/linux/providers.d.ts.map +1 -0
- package/dist/linux/region.d.ts +43 -0
- package/dist/linux/region.d.ts.map +1 -0
- package/dist/linux/remote-file-form.d.ts +47 -0
- package/dist/linux/remote-file-form.d.ts.map +1 -0
- package/dist/linux/remote-file-lifecycle.d.ts +36 -0
- package/dist/linux/remote-file-lifecycle.d.ts.map +1 -0
- package/dist/linux/remote-file-plan.d.ts +33 -0
- package/dist/linux/remote-file-plan.d.ts.map +1 -0
- package/dist/linux/remote-file.d.ts +28 -0
- package/dist/linux/remote-file.d.ts.map +1 -0
- package/dist/linux/ssh-command.d.ts +68 -0
- package/dist/linux/ssh-command.d.ts.map +1 -0
- package/dist/linux/ssh-runner.d.ts +22 -0
- package/dist/linux/ssh-runner.d.ts.map +1 -0
- package/dist/linux/ssh-scripts.d.ts +27 -0
- package/dist/linux/ssh-scripts.d.ts.map +1 -0
- package/dist/linux/systemctl.d.ts +67 -0
- package/dist/linux/systemctl.d.ts.map +1 -0
- package/dist/linux/unit-form.d.ts +78 -0
- package/dist/linux/unit-form.d.ts.map +1 -0
- package/dist/linux/unit-handlers.d.ts +15 -0
- package/dist/linux/unit-handlers.d.ts.map +1 -0
- package/dist/linux/unit-lifecycle.d.ts +44 -0
- package/dist/linux/unit-lifecycle.d.ts.map +1 -0
- package/dist/linux/unit-settle.d.ts +31 -0
- package/dist/linux/unit-settle.d.ts.map +1 -0
- package/dist/linux/unit.d.ts +35 -0
- package/dist/linux/unit.d.ts.map +1 -0
- package/dist/netbox/client.d.ts +52 -0
- package/dist/netbox/client.d.ts.map +1 -0
- package/dist/netbox/constraint-guard.d.ts +26 -0
- package/dist/netbox/constraint-guard.d.ts.map +1 -0
- package/dist/netbox/constraints.d.ts +76 -0
- package/dist/netbox/constraints.d.ts.map +1 -0
- package/dist/netbox/generated/constraints/index.d.ts +19 -0
- package/dist/netbox/generated/constraints/index.d.ts.map +1 -0
- package/dist/netbox/generated/constraints/netbox-ipam.d.ts +21 -0
- package/dist/netbox/generated/constraints/netbox-ipam.d.ts.map +1 -0
- package/dist/netbox/index.d.ts +17 -0
- package/dist/netbox/index.d.ts.map +1 -0
- package/dist/netbox/index.js +331 -0
- package/dist/netbox/index.js.map +18 -0
- package/dist/netbox/prefix-form.d.ts +54 -0
- package/dist/netbox/prefix-form.d.ts.map +1 -0
- package/dist/netbox/prefix.d.ts +80 -0
- package/dist/netbox/prefix.d.ts.map +1 -0
- package/dist/netbox/resource.d.ts +94 -0
- package/dist/netbox/resource.d.ts.map +1 -0
- package/dist/netbox/values.d.ts +24 -0
- package/dist/netbox/values.d.ts.map +1 -0
- package/dist/openbao/index.d.ts +10 -3
- package/dist/openbao/index.d.ts.map +1 -1
- package/dist/proxmox/acl.d.ts.map +1 -1
- package/dist/proxmox/api-token-form.d.ts.map +1 -1
- package/dist/proxmox/apply-endpoints.d.ts +30 -0
- package/dist/proxmox/apply-endpoints.d.ts.map +1 -0
- package/dist/proxmox/backup-job.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon-form.d.ts +29 -1
- package/dist/proxmox/ceph-daemon-form.d.ts.map +1 -1
- package/dist/proxmox/ceph-daemon.d.ts.map +1 -1
- package/dist/proxmox/ceph-flag.d.ts.map +1 -1
- package/dist/proxmox/ceph-fs.d.ts.map +1 -1
- package/dist/proxmox/ceph-osd-write.d.ts +19 -0
- package/dist/proxmox/ceph-osd-write.d.ts.map +1 -1
- package/dist/proxmox/ceph-pool.d.ts.map +1 -1
- package/dist/proxmox/constraint-guard.d.ts +28 -0
- package/dist/proxmox/constraint-guard.d.ts.map +1 -0
- package/dist/proxmox/constraints.d.ts +94 -0
- package/dist/proxmox/constraints.d.ts.map +1 -0
- package/dist/proxmox/firewall-alias.d.ts.map +1 -1
- package/dist/proxmox/generated/constraints/index.d.ts +19 -0
- package/dist/proxmox/generated/constraints/index.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pbs-config.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pbs-config.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-access.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-access.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-backup.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-ceph.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-firewall.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-ha.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-metrics.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-notifications.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-replication.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-cluster-sdn.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-ceph.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-disks.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-lxc.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-network.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-nodes-qemu.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-pools.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-pools.d.ts.map +1 -0
- package/dist/proxmox/generated/constraints/pve-storage.d.ts +23 -0
- package/dist/proxmox/generated/constraints/pve-storage.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/access-users.d.ts +137 -0
- package/dist/proxmox/generated/pbs/access-users.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/access.d.ts +171 -0
- package/dist/proxmox/generated/pbs/access.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/admin-datastore-store.d.ts +252 -0
- package/dist/proxmox/generated/pbs/admin-datastore-store.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/admin-metrics.d.ts +147 -0
- package/dist/proxmox/generated/pbs/admin-metrics.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/admin.d.ts +217 -0
- package/dist/proxmox/generated/pbs/admin.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/backup.d.ts +114 -0
- package/dist/proxmox/generated/pbs/backup.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-access-pam.d.ts +218 -0
- package/dist/proxmox/generated/pbs/config-access-pam.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-access.d.ts +203 -0
- package/dist/proxmox/generated/pbs/config-access.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-datastore.d.ts +195 -0
- package/dist/proxmox/generated/pbs/config-datastore.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-media-pool.d.ts +207 -0
- package/dist/proxmox/generated/pbs/config-media-pool.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-notifications-matchers.d.ts +159 -0
- package/dist/proxmox/generated/pbs/config-notifications-matchers.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-notifications.d.ts +199 -0
- package/dist/proxmox/generated/pbs/config-notifications.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-remote.d.ts +175 -0
- package/dist/proxmox/generated/pbs/config-remote.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-sync.d.ts +145 -0
- package/dist/proxmox/generated/pbs/config-sync.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-tape.d.ts +200 -0
- package/dist/proxmox/generated/pbs/config-tape.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config-verify.d.ts +77 -0
- package/dist/proxmox/generated/pbs/config-verify.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/config.d.ts +119 -0
- package/dist/proxmox/generated/pbs/config.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/nodes-node-dns.d.ts +178 -0
- package/dist/proxmox/generated/pbs/nodes-node-dns.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/nodes-node-services.d.ts +205 -0
- package/dist/proxmox/generated/pbs/nodes-node-services.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/nodes-node.d.ts +166 -0
- package/dist/proxmox/generated/pbs/nodes-node.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/nodes.d.ts +171 -0
- package/dist/proxmox/generated/pbs/nodes.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/ping.d.ts +18 -0
- package/dist/proxmox/generated/pbs/ping.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/pull.d.ts +37 -0
- package/dist/proxmox/generated/pbs/pull.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/push.d.ts +36 -0
- package/dist/proxmox/generated/pbs/push.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/reader.d.ts +41 -0
- package/dist/proxmox/generated/pbs/reader.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/root.d.ts +16 -0
- package/dist/proxmox/generated/pbs/root.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/status.d.ts +54 -0
- package/dist/proxmox/generated/pbs/status.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/tape-drive.d.ts +181 -0
- package/dist/proxmox/generated/pbs/tape-drive.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/tape-media.d.ts +126 -0
- package/dist/proxmox/generated/pbs/tape-media.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/tape.d.ts +90 -0
- package/dist/proxmox/generated/pbs/tape.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs/version.d.ts +20 -0
- package/dist/proxmox/generated/pbs/version.d.ts.map +1 -0
- package/dist/proxmox/generated/pbs.d.ts +44 -662
- package/dist/proxmox/generated/pbs.d.ts.map +1 -1
- package/dist/proxmox/generated/pve/access-roles.d.ts +164 -0
- package/dist/proxmox/generated/pve/access-roles.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/access-users.d.ts +152 -0
- package/dist/proxmox/generated/pve/access-users.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/access.d.ts +221 -0
- package/dist/proxmox/generated/pve/access.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-acme-plugins-id.d.ts +45 -0
- package/dist/proxmox/generated/pve/cluster-acme-plugins-id.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-acme-plugins.d.ts +47 -0
- package/dist/proxmox/generated/pve/cluster-acme-plugins.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-acme-tos.d.ts +240 -0
- package/dist/proxmox/generated/pve/cluster-acme-tos.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-bulk-action.d.ts +200 -0
- package/dist/proxmox/generated/pve/cluster-bulk-action.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-firewall-refs.d.ts +109 -0
- package/dist/proxmox/generated/pve/cluster-firewall-refs.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-firewall.d.ts +225 -0
- package/dist/proxmox/generated/pve/cluster-firewall.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-ha.d.ts +199 -0
- package/dist/proxmox/generated/pve/cluster-ha.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-jobs.d.ts +183 -0
- package/dist/proxmox/generated/pve/cluster-jobs.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-metrics.d.ts +110 -0
- package/dist/proxmox/generated/pve/cluster-metrics.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-notifications-endpoints.d.ts +224 -0
- package/dist/proxmox/generated/pve/cluster-notifications-endpoints.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-notifications.d.ts +91 -0
- package/dist/proxmox/generated/pve/cluster-notifications.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-options.d.ts +85 -0
- package/dist/proxmox/generated/pve/cluster-options.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.d.ts +48 -0
- package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models.d.ts +45 -0
- package/dist/proxmox/generated/pve/cluster-qemu-custom-cpu-models.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-replication.d.ts +130 -0
- package/dist/proxmox/generated/pve/cluster-replication.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts +220 -0
- package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn-ipams.d.ts +229 -0
- package/dist/proxmox/generated/pve/cluster-sdn-ipams.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn-vnets-vnet.d.ts +229 -0
- package/dist/proxmox/generated/pve/cluster-sdn-vnets-vnet.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn-vnets.d.ts +51 -0
- package/dist/proxmox/generated/pve/cluster-sdn-vnets.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn-zones.d.ts +225 -0
- package/dist/proxmox/generated/pve/cluster-sdn-zones.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster-sdn.d.ts +202 -0
- package/dist/proxmox/generated/pve/cluster-sdn.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/cluster.d.ts +69 -0
- package/dist/proxmox/generated/pve/cluster.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-ceph.d.ts +167 -0
- package/dist/proxmox/generated/pve/nodes-node-ceph.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-config.d.ts +43 -0
- package/dist/proxmox/generated/pve/nodes-node-config.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-disks.d.ts +225 -0
- package/dist/proxmox/generated/pve/nodes-node-disks.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-firewall.d.ts +145 -0
- package/dist/proxmox/generated/pve/nodes-node-firewall.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-hardware.d.ts +195 -0
- package/dist/proxmox/generated/pve/nodes-node-hardware.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.d.ts +191 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.d.ts +33 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.d.ts +56 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-resize.d.ts +28 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-resize.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.d.ts +186 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid.d.ts +191 -0
- package/dist/proxmox/generated/pve/nodes-node-lxc-vmid.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-network.d.ts +150 -0
- package/dist/proxmox/generated/pve/nodes-node-network.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-config.d.ts +301 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-config.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.d.ts +170 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.d.ts +144 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.d.ts +34 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.d.ts +137 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-status.d.ts +179 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid-status.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid.d.ts +143 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu-vmid.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu.d.ts +158 -0
- package/dist/proxmox/generated/pve/nodes-node-qemu.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-replication.d.ts +187 -0
- package/dist/proxmox/generated/pve/nodes-node-replication.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-services.d.ts +115 -0
- package/dist/proxmox/generated/pve/nodes-node-services.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-storage-storage.d.ts +202 -0
- package/dist/proxmox/generated/pve/nodes-node-storage-storage.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-storage.d.ts +40 -0
- package/dist/proxmox/generated/pve/nodes-node-storage.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-subscription.d.ts +173 -0
- package/dist/proxmox/generated/pve/nodes-node-subscription.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node-vzdump.d.ts +97 -0
- package/dist/proxmox/generated/pve/nodes-node-vzdump.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes-node.d.ts +207 -0
- package/dist/proxmox/generated/pve/nodes-node.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/nodes.d.ts +236 -0
- package/dist/proxmox/generated/pve/nodes.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/pools.d.ts +82 -0
- package/dist/proxmox/generated/pve/pools.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/storage.d.ts +159 -0
- package/dist/proxmox/generated/pve/storage.d.ts.map +1 -0
- package/dist/proxmox/generated/pve/version.d.ts +21 -0
- package/dist/proxmox/generated/pve/version.d.ts.map +1 -0
- package/dist/proxmox/generated/pve.d.ts +69 -4766
- package/dist/proxmox/generated/pve.d.ts.map +1 -1
- package/dist/proxmox/group.d.ts.map +1 -1
- package/dist/proxmox/ha-resource.d.ts.map +1 -1
- package/dist/proxmox/ha-rule.d.ts.map +1 -1
- package/dist/proxmox/index.d.ts +6 -1
- package/dist/proxmox/index.d.ts.map +1 -1
- package/dist/proxmox/index.js +1483 -300
- package/dist/proxmox/index.js.map +70 -45
- package/dist/proxmox/lxc-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/metric-server-form.d.ts +11 -0
- package/dist/proxmox/metric-server-form.d.ts.map +1 -1
- package/dist/proxmox/metric-server.d.ts.map +1 -1
- package/dist/proxmox/network-apply.d.ts.map +1 -1
- package/dist/proxmox/node-network-form.d.ts +15 -0
- package/dist/proxmox/node-network-form.d.ts.map +1 -1
- package/dist/proxmox/node-network.d.ts.map +1 -1
- package/dist/proxmox/notification-matcher.d.ts.map +1 -1
- package/dist/proxmox/notification-target-endpoint.d.ts +26 -0
- package/dist/proxmox/notification-target-endpoint.d.ts.map +1 -0
- package/dist/proxmox/notification-target-form.d.ts +7 -0
- package/dist/proxmox/notification-target-form.d.ts.map +1 -1
- package/dist/proxmox/notification-target.d.ts.map +1 -1
- package/dist/proxmox/pbs-datastore-endpoint.d.ts +22 -0
- package/dist/proxmox/pbs-datastore-endpoint.d.ts.map +1 -0
- package/dist/proxmox/pbs-datastore.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-matcher.d.ts.map +1 -1
- package/dist/proxmox/pbs-notification-target-endpoint.d.ts +29 -0
- package/dist/proxmox/pbs-notification-target-endpoint.d.ts.map +1 -0
- package/dist/proxmox/pbs-notification-target-lifecycle.d.ts.map +1 -1
- package/dist/proxmox/pbs-prune-job.d.ts.map +1 -1
- package/dist/proxmox/pbs-sync-job-form.d.ts.map +1 -1
- package/dist/proxmox/pbs-verify-job.d.ts.map +1 -1
- package/dist/proxmox/pool.d.ts.map +1 -1
- package/dist/proxmox/provision-baseline.d.ts +30 -5
- package/dist/proxmox/provision-baseline.d.ts.map +1 -1
- package/dist/proxmox/qemu.d.ts +10 -0
- package/dist/proxmox/qemu.d.ts.map +1 -1
- package/dist/proxmox/replication-job.d.ts.map +1 -1
- package/dist/proxmox/resource-guard.d.ts +15 -0
- package/dist/proxmox/resource-guard.d.ts.map +1 -0
- package/dist/proxmox/resource-spec.d.ts +131 -0
- package/dist/proxmox/resource-spec.d.ts.map +1 -0
- package/dist/proxmox/resource.d.ts +17 -90
- package/dist/proxmox/resource.d.ts.map +1 -1
- package/dist/proxmox/role.d.ts.map +1 -1
- package/dist/proxmox/sdn-apply.d.ts.map +1 -1
- package/dist/proxmox/sdn-subnet.d.ts.map +1 -1
- package/dist/proxmox/sdn-vnet.d.ts.map +1 -1
- package/dist/proxmox/sdn-zone.d.ts.map +1 -1
- package/dist/proxmox/storage.d.ts.map +1 -1
- package/dist/proxmox/user.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool-write.d.ts +11 -0
- package/dist/proxmox/zfs-pool-write.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool.d.ts.map +1 -1
- package/docs/linux-host-measured.md +56 -0
- package/docs/linux-host.md +186 -0
- package/docs/netbox.md +103 -0
- package/docs/provision-baseline.md +34 -7
- package/docs/proxmox-lxc.md +40 -0
- package/package.json +9 -1
- package/src/linux/directory-lifecycle.ts +220 -0
- package/src/linux/directory.test.ts +132 -0
- package/src/linux/directory.ts +71 -0
- package/src/linux/fake-linux-host.ts +197 -0
- package/src/linux/fake-systemd.ts +103 -0
- package/src/linux/index.ts +32 -0
- package/src/linux/providers.ts +26 -0
- package/src/linux/region.test.ts +89 -0
- package/src/linux/region.ts +118 -0
- package/src/linux/remote-file-form.ts +96 -0
- package/src/linux/remote-file-lifecycle.test.ts +191 -0
- package/src/linux/remote-file-lifecycle.ts +161 -0
- package/src/linux/remote-file-plan.ts +154 -0
- package/src/linux/remote-file.ts +88 -0
- package/src/linux/ssh-command.test.ts +140 -0
- package/src/linux/ssh-command.ts +99 -0
- package/src/linux/ssh-runner.ts +188 -0
- package/src/linux/ssh-scripts.ts +105 -0
- package/src/linux/systemctl.ts +145 -0
- package/src/linux/unit-form.ts +183 -0
- package/src/linux/unit-handlers.ts +73 -0
- package/src/linux/unit-lifecycle.test.ts +220 -0
- package/src/linux/unit-lifecycle.ts +193 -0
- package/src/linux/unit-settle.ts +110 -0
- package/src/linux/unit.ts +81 -0
- package/src/netbox/client.test.ts +67 -0
- package/src/netbox/client.ts +146 -0
- package/src/netbox/constraint-guard.ts +57 -0
- package/src/netbox/constraints.test.ts +114 -0
- package/src/netbox/constraints.ts +152 -0
- package/src/netbox/generated/constraints/index.ts +23 -0
- package/src/netbox/generated/constraints/netbox-ipam.ts +32 -0
- package/src/netbox/index.ts +34 -0
- package/src/netbox/prefix-form.test.ts +127 -0
- package/src/netbox/prefix-form.ts +84 -0
- package/src/netbox/prefix.ts +136 -0
- package/src/netbox/resource.ts +208 -0
- package/src/netbox/values.test.ts +66 -0
- package/src/netbox/values.ts +40 -0
- package/src/openbao/index-types.test.ts +87 -0
- package/src/openbao/index.ts +15 -3
- package/src/proxmox/acl.ts +2 -0
- package/src/proxmox/api-token-form.ts +5 -0
- package/src/proxmox/apply-endpoints.ts +34 -0
- package/src/proxmox/backup-job.ts +2 -0
- package/src/proxmox/ceph-daemon-form.ts +56 -2
- package/src/proxmox/ceph-daemon.ts +10 -21
- package/src/proxmox/ceph-flag.ts +1 -0
- package/src/proxmox/ceph-fs.ts +1 -0
- package/src/proxmox/ceph-osd-write.ts +30 -4
- package/src/proxmox/ceph-pool.ts +10 -0
- package/src/proxmox/constraint-guard.ts +53 -0
- package/src/proxmox/constraints-dialect.test.ts +165 -0
- package/src/proxmox/constraints-forms.test.ts +220 -0
- package/src/proxmox/constraints-host-forms.test.ts +132 -0
- package/src/proxmox/constraints-live.test.ts +155 -0
- package/src/proxmox/constraints-node-forms.test.ts +188 -0
- package/src/proxmox/constraints-required.test.ts +172 -0
- package/src/proxmox/constraints.test.ts +205 -0
- package/src/proxmox/constraints.ts +160 -0
- package/src/proxmox/firewall-alias.ts +5 -0
- package/src/proxmox/generated/constraints/index.ts +55 -0
- package/src/proxmox/generated/constraints/pbs-config.ts +203 -0
- package/src/proxmox/generated/constraints/pve-access.ts +69 -0
- package/src/proxmox/generated/constraints/pve-cluster-backup.ts +74 -0
- package/src/proxmox/generated/constraints/pve-cluster-ceph.ts +27 -0
- package/src/proxmox/generated/constraints/pve-cluster-firewall.ts +35 -0
- package/src/proxmox/generated/constraints/pve-cluster-ha.ts +55 -0
- package/src/proxmox/generated/constraints/pve-cluster-metrics.ts +59 -0
- package/src/proxmox/generated/constraints/pve-cluster-notifications.ts +80 -0
- package/src/proxmox/generated/constraints/pve-cluster-replication.ts +43 -0
- package/src/proxmox/generated/constraints/pve-cluster-sdn.ts +90 -0
- package/src/proxmox/generated/constraints/pve-nodes-ceph.ts +57 -0
- package/src/proxmox/generated/constraints/pve-nodes-disks.ts +31 -0
- package/src/proxmox/generated/constraints/pve-nodes-lxc.ts +82 -0
- package/src/proxmox/generated/constraints/pve-nodes-network.ts +77 -0
- package/src/proxmox/generated/constraints/pve-nodes-qemu.ts +125 -0
- package/src/proxmox/generated/constraints/pve-pools.ts +31 -0
- package/src/proxmox/generated/constraints/pve-storage.ts +80 -0
- package/src/proxmox/generated/pbs/access-users.ts +137 -0
- package/src/proxmox/generated/pbs/access.ts +232 -0
- package/src/proxmox/generated/pbs/admin-datastore-store.ts +238 -0
- package/src/proxmox/generated/pbs/admin-metrics.ts +147 -0
- package/src/proxmox/generated/pbs/admin.ts +225 -0
- package/src/proxmox/generated/pbs/backup.ts +121 -0
- package/src/proxmox/generated/pbs/config-access-pam.ts +228 -0
- package/src/proxmox/generated/pbs/config-access.ts +228 -0
- package/src/proxmox/generated/pbs/config-datastore.ts +217 -0
- package/src/proxmox/generated/pbs/config-media-pool.ts +232 -0
- package/src/proxmox/generated/pbs/config-notifications-matchers.ts +187 -0
- package/src/proxmox/generated/pbs/config-notifications.ts +221 -0
- package/src/proxmox/generated/pbs/config-remote.ts +192 -0
- package/src/proxmox/generated/pbs/config-sync.ts +167 -0
- package/src/proxmox/generated/pbs/config-tape.ts +226 -0
- package/src/proxmox/generated/pbs/config-verify.ts +87 -0
- package/src/proxmox/generated/pbs/config.ts +135 -0
- package/src/proxmox/generated/pbs/nodes-node-dns.ts +229 -0
- package/src/proxmox/generated/pbs/nodes-node-services.ts +181 -0
- package/src/proxmox/generated/pbs/nodes-node.ts +244 -0
- package/src/proxmox/generated/pbs/nodes.ts +160 -0
- package/src/proxmox/generated/pbs/ping.ts +16 -0
- package/src/proxmox/generated/pbs/pull.ts +37 -0
- package/src/proxmox/generated/pbs/push.ts +36 -0
- package/src/proxmox/generated/pbs/reader.ts +41 -0
- package/src/proxmox/generated/pbs/root.ts +16 -0
- package/src/proxmox/generated/pbs/status.ts +50 -0
- package/src/proxmox/generated/pbs/tape-drive.ts +220 -0
- package/src/proxmox/generated/pbs/tape-media.ts +133 -0
- package/src/proxmox/generated/pbs/tape.ts +92 -0
- package/src/proxmox/generated/pbs/version.ts +16 -0
- package/src/proxmox/generated/pbs.ts +44 -787
- package/src/proxmox/generated/pve/access-roles.ts +168 -0
- package/src/proxmox/generated/pve/access-users.ts +155 -0
- package/src/proxmox/generated/pve/access.ts +217 -0
- package/src/proxmox/generated/pve/cluster-acme-plugins-id.ts +367 -0
- package/src/proxmox/generated/pve/cluster-acme-plugins.ts +366 -0
- package/src/proxmox/generated/pve/cluster-acme-tos.ts +232 -0
- package/src/proxmox/generated/pve/cluster-bulk-action.ts +227 -0
- package/src/proxmox/generated/pve/cluster-firewall-refs.ts +110 -0
- package/src/proxmox/generated/pve/cluster-firewall.ts +236 -0
- package/src/proxmox/generated/pve/cluster-ha.ts +203 -0
- package/src/proxmox/generated/pve/cluster-jobs.ts +190 -0
- package/src/proxmox/generated/pve/cluster-metrics.ts +116 -0
- package/src/proxmox/generated/pve/cluster-notifications-endpoints.ts +244 -0
- package/src/proxmox/generated/pve/cluster-notifications.ts +99 -0
- package/src/proxmox/generated/pve/cluster-options.ts +189 -0
- package/src/proxmox/generated/pve/cluster-qemu-custom-cpu-models-cputype.ts +272 -0
- package/src/proxmox/generated/pve/cluster-qemu-custom-cpu-models.ts +268 -0
- package/src/proxmox/generated/pve/cluster-replication.ts +127 -0
- package/src/proxmox/generated/pve/cluster-sdn-fabrics.ts +218 -0
- package/src/proxmox/generated/pve/cluster-sdn-ipams.ts +229 -0
- package/src/proxmox/generated/pve/cluster-sdn-vnets-vnet.ts +245 -0
- package/src/proxmox/generated/pve/cluster-sdn-vnets.ts +49 -0
- package/src/proxmox/generated/pve/cluster-sdn-zones.ts +224 -0
- package/src/proxmox/generated/pve/cluster-sdn.ts +201 -0
- package/src/proxmox/generated/pve/cluster.ts +71 -0
- package/src/proxmox/generated/pve/nodes-node-ceph.ts +167 -0
- package/src/proxmox/generated/pve/nodes-node-config.ts +56 -0
- package/src/proxmox/generated/pve/nodes-node-disks.ts +237 -0
- package/src/proxmox/generated/pve/nodes-node-firewall.ts +239 -0
- package/src/proxmox/generated/pve/nodes-node-hardware.ts +215 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid-firewall.ts +232 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid-move-volume.ts +1059 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid-mtunnel.ts +49 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid-resize.ts +285 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid-rrd.ts +184 -0
- package/src/proxmox/generated/pve/nodes-node-lxc-vmid.ts +240 -0
- package/src/proxmox/generated/pve/nodes-node-network.ts +234 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-config.ts +441 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-dbus-vmstate.ts +215 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-firewall-rules.ts +145 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-move-disk.ts +664 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-mtunnel.ts +188 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid-status.ts +233 -0
- package/src/proxmox/generated/pve/nodes-node-qemu-vmid.ts +187 -0
- package/src/proxmox/generated/pve/nodes-node-qemu.ts +204 -0
- package/src/proxmox/generated/pve/nodes-node-replication.ts +187 -0
- package/src/proxmox/generated/pve/nodes-node-services.ts +221 -0
- package/src/proxmox/generated/pve/nodes-node-storage-storage.ts +226 -0
- package/src/proxmox/generated/pve/nodes-node-storage.ts +40 -0
- package/src/proxmox/generated/pve/nodes-node-subscription.ts +168 -0
- package/src/proxmox/generated/pve/nodes-node-vzdump.ts +96 -0
- package/src/proxmox/generated/pve/nodes-node.ts +211 -0
- package/src/proxmox/generated/pve/nodes.ts +235 -0
- package/src/proxmox/generated/pve/pools.ts +78 -0
- package/src/proxmox/generated/pve/storage.ts +213 -0
- package/src/proxmox/generated/pve/version.ts +21 -0
- package/src/proxmox/generated/pve.ts +69 -7403
- package/src/proxmox/group.ts +2 -0
- package/src/proxmox/ha-resource.ts +5 -0
- package/src/proxmox/ha-rule.ts +2 -0
- package/src/proxmox/index.ts +12 -0
- package/src/proxmox/lxc-interior.test.ts +77 -0
- package/src/proxmox/lxc-lifecycle.ts +48 -9
- package/src/proxmox/metric-server-form.ts +10 -0
- package/src/proxmox/metric-server.ts +11 -2
- package/src/proxmox/network-apply.ts +4 -0
- package/src/proxmox/node-network-form.ts +19 -0
- package/src/proxmox/node-network.ts +9 -3
- package/src/proxmox/notification-matcher.ts +5 -0
- package/src/proxmox/notification-target-endpoint.ts +46 -0
- package/src/proxmox/notification-target-form.ts +11 -0
- package/src/proxmox/notification-target.ts +5 -2
- package/src/proxmox/pbs-datastore-endpoint.ts +29 -0
- package/src/proxmox/pbs-datastore.ts +8 -1
- package/src/proxmox/pbs-notification-matcher.ts +5 -0
- package/src/proxmox/pbs-notification-target-endpoint.ts +45 -0
- package/src/proxmox/pbs-notification-target-lifecycle.ts +16 -14
- package/src/proxmox/pbs-prune-job.ts +2 -0
- package/src/proxmox/pbs-sync-job-form.ts +2 -0
- package/src/proxmox/pbs-verify-job.ts +2 -0
- package/src/proxmox/pool.ts +2 -0
- package/src/proxmox/provision-baseline.test.ts +38 -0
- package/src/proxmox/provision-baseline.ts +73 -14
- package/src/proxmox/provision-bootstrap.test.ts +51 -0
- package/src/proxmox/qemu.ts +9 -1
- package/src/proxmox/replication-job.ts +5 -0
- package/src/proxmox/resource-guard.ts +61 -0
- package/src/proxmox/resource-spec.ts +129 -0
- package/src/proxmox/resource.ts +52 -93
- package/src/proxmox/role.ts +2 -0
- package/src/proxmox/sdn-apply.ts +4 -0
- package/src/proxmox/sdn-subnet.ts +5 -0
- package/src/proxmox/sdn-vnet.ts +2 -0
- package/src/proxmox/sdn-zone.ts +2 -0
- package/src/proxmox/storage.ts +2 -0
- package/src/proxmox/user.ts +2 -0
- package/src/proxmox/zfs-pool-write.ts +12 -0
- package/src/proxmox/zfs-pool.ts +2 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vendor's own limits, enforced at plan time — built from the failure that made them necessary.
|
|
3
|
+
*
|
|
4
|
+
* 🔴 2026-09-22, `homeflare-proxmox` `deploy:pbs`: ten objects adopted, then
|
|
5
|
+
* `POST config/verify -> 400: parameter verification failed - comment: value may only be 128
|
|
6
|
+
* characters long`. The job was `v-r2-offsite`, the monthly read-back of the R2 copy. Plan,
|
|
7
|
+
* `bun run check`, the family's own tests and `hf-adopt-verify` were all green, because the only
|
|
8
|
+
* place the number 128 existed was PBS's published schema.
|
|
9
|
+
*
|
|
10
|
+
* ★ SO THE FIRST TEST IS THAT JOB, WITH A 129-CHARACTER COMMENT, THROUGH ALCHEMY'S OWN ENGINE, and
|
|
11
|
+
* the assertion that matters is not only the message: it is that `fake.writes()` is EMPTY. The
|
|
12
|
+
* incident was half a deploy landing before the refusal.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, expect, test } from 'bun:test';
|
|
15
|
+
import * as Layer from 'effect/Layer';
|
|
16
|
+
import { engineOver } from '../verify/fake-engine.ts';
|
|
17
|
+
// ⚠️ The estate's own declarations live in constraints-live.test.ts — split at the 250-line cap.
|
|
18
|
+
import { constraintsFor, formViolations } from './constraint-guard.ts';
|
|
19
|
+
import { type EndpointConstraints, refusal, violations } from './constraints.ts';
|
|
20
|
+
import type { PbsTarget } from './credentials.ts';
|
|
21
|
+
import { fakePve, withoutBao } from './fake-pve.ts';
|
|
22
|
+
import { PROXMOX_CONSTRAINTS, PROXMOX_CONSTRAINTS_DIGEST } from './generated/constraints/index.ts';
|
|
23
|
+
import { PbsVerifyJob, PbsVerifyJobProvider } from './pbs-verify-job.ts';
|
|
24
|
+
|
|
25
|
+
const PBS: PbsTarget = { api: 'https://pbs.test:8007/api2/json', mount: 'pbs-test', scheme: 'pbs' };
|
|
26
|
+
const VERIFY = 'pbs:POST /config/verify';
|
|
27
|
+
const BELL = String.fromCodePoint(7);
|
|
28
|
+
const ROCKET = String.fromCodePoint(0x1f680);
|
|
29
|
+
|
|
30
|
+
/** The real declaration, comment length made an argument. */
|
|
31
|
+
const job = (comment: string) =>
|
|
32
|
+
PbsVerifyJob('v-r2-offsite', {
|
|
33
|
+
comment,
|
|
34
|
+
id: 'v-r2-offsite',
|
|
35
|
+
'ignore-verified': true,
|
|
36
|
+
'outdated-after': 30,
|
|
37
|
+
schedule: 'Sun *-1..7 11:00',
|
|
38
|
+
store: 'r2-offsite',
|
|
39
|
+
target: PBS,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('the v-r2-offsite failure, refused at plan instead of by the server', () => {
|
|
43
|
+
const deployWith = async (comment: string) => {
|
|
44
|
+
/**
|
|
45
|
+
* A PBS that does not have this job yet, so the plan is a CREATE — the branch `diff` used to
|
|
46
|
+
* skip entirely (`output === undefined` returned before any check). It remembers the POST so
|
|
47
|
+
* the read-back in `reconcile` can succeed, which is what the 128-character case needs.
|
|
48
|
+
*/
|
|
49
|
+
const live = new Map<string, Record<string, unknown>>();
|
|
50
|
+
const fake = fakePve((call) => {
|
|
51
|
+
if (call.method === 'GET') return live.get(call.path);
|
|
52
|
+
if (call.method === 'POST') live.set(`config/verify/${String(call.form['id'])}`, call.form);
|
|
53
|
+
return undefined;
|
|
54
|
+
});
|
|
55
|
+
const engine = engineOver(PbsVerifyJobProvider().pipe(Layer.provideMerge(fake.layer)));
|
|
56
|
+
const outcome = await withoutBao(() =>
|
|
57
|
+
engine.deploy(job(comment)).then(
|
|
58
|
+
() => ({ error: undefined as unknown }),
|
|
59
|
+
(error: unknown) => ({ error }),
|
|
60
|
+
),
|
|
61
|
+
);
|
|
62
|
+
return { ...outcome, calls: fake.calls, writes: fake.writes() };
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
test('129 characters is refused, and NOTHING is written', async () => {
|
|
66
|
+
const { calls, error, writes } = await deployWith('c'.repeat(129));
|
|
67
|
+
expect(String(error)).toContain('comment: at most 128 characters');
|
|
68
|
+
expect(String(error)).toContain(VERIFY);
|
|
69
|
+
// ⛔ THE ASSERTION THE INCIDENT IS ABOUT. A refusal after the POST is the server's own 400.
|
|
70
|
+
expect(writes).toEqual([]);
|
|
71
|
+
/**
|
|
72
|
+
* ⚠️ EVERY CALL IS A READ, AND THERE ARE NOW TWO OF THEM. Measured 2026-09-22: Alchemy runs
|
|
73
|
+
* the provider's `read` handler first, and `reconcile` reads again — the guard moved to
|
|
74
|
+
* AFTER that second read the same day, because the read is the only thing that says whether
|
|
75
|
+
* a create or an update is about to be made, and demanding the create form's required
|
|
76
|
+
* parameters on an update refuses edits that were always legal (resource-guard.ts).
|
|
77
|
+
* ⛔ THE COUNT IS NOT THE ASSERTION; THE METHOD IS. Nothing is created or changed.
|
|
78
|
+
*/
|
|
79
|
+
expect(calls.map((call) => call.method)).toEqual(['GET', 'GET']);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('128 characters is accepted and the create goes through', async () => {
|
|
83
|
+
const { error, writes } = await deployWith('c'.repeat(128));
|
|
84
|
+
expect(error).toBeUndefined();
|
|
85
|
+
expect(writes).toEqual(['POST config/verify']);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('the table is the vendor own rule set, read from the generated file', () => {
|
|
90
|
+
test('POST /config/verify carries the 128 and the safe-id rules PBS publishes', () => {
|
|
91
|
+
const table = constraintsFor(VERIFY);
|
|
92
|
+
expect(table['comment']).toMatchObject({ maxLength: 128, type: 'string' });
|
|
93
|
+
expect(table['id']).toMatchObject({ maxLength: 32, minLength: 3, required: true });
|
|
94
|
+
expect(table['max-depth']).toMatchObject({ maximum: 7, minimum: 0 });
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('an unknown endpoint is a defect that names the command, not a silent pass', () => {
|
|
98
|
+
expect(() => constraintsFor('pbs:POST /config/nope')).toThrow('bun codegen/constraints.ts');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* ⚠️ PBS's `comment` pattern is a POSIX class inside Rust regex delimiters, neither of which
|
|
103
|
+
* JavaScript reads the same way. `new RegExp` accepts BOTH silently and means something else.
|
|
104
|
+
* This asserts the translation, because a wrong one refuses every legal comment.
|
|
105
|
+
*/
|
|
106
|
+
test('the PBS comment pattern is translated, not copied', () => {
|
|
107
|
+
const rule = constraintsFor(VERIFY)['comment'];
|
|
108
|
+
expect(rule?.patternSource).toContain('cntrl');
|
|
109
|
+
expect(formViolations(VERIFY, { comment: 'nightly read-back of the R2 copy' }, false)).toEqual(
|
|
110
|
+
[],
|
|
111
|
+
);
|
|
112
|
+
expect(formViolations(VERIFY, { comment: `bell${BELL}here` }, false)).toEqual([
|
|
113
|
+
`comment: must match ${rule?.patternSource ?? ''}`,
|
|
114
|
+
]);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* ⚠️ THE SORT IS PART OF THE DIGEST, and it is spelled out here rather than imported from
|
|
119
|
+
* `codegen/emit.ts`: `src/` is published, and a test that reached out of the package would
|
|
120
|
+
* ship a broken import in the tarball. The generator sorts for the same reason it must be
|
|
121
|
+
* sorted here — it merges per area, this module spreads per import.
|
|
122
|
+
*/
|
|
123
|
+
test('the committed tables match their own digest, so no value was hand-edited', () => {
|
|
124
|
+
const sorted = Object.fromEntries(
|
|
125
|
+
Object.keys(PROXMOX_CONSTRAINTS)
|
|
126
|
+
.sort()
|
|
127
|
+
.map((key) => [key, PROXMOX_CONSTRAINTS[key]]),
|
|
128
|
+
);
|
|
129
|
+
const recomputed = new Bun.CryptoHasher('sha256')
|
|
130
|
+
.update(JSON.stringify(sorted))
|
|
131
|
+
.digest('hex')
|
|
132
|
+
.slice(0, 16);
|
|
133
|
+
expect(recomputed).toBe(PROXMOX_CONSTRAINTS_DIGEST);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* ★ ONE MUTANT PER BRANCH. Each case below fails if that single comparison is deleted, inverted or
|
|
139
|
+
* its boundary moved by one — which is the only way to know the validator checks what it claims
|
|
140
|
+
* rather than passing everything.
|
|
141
|
+
*/
|
|
142
|
+
describe('every rule kind, at and past its boundary', () => {
|
|
143
|
+
const table: EndpointConstraints = {
|
|
144
|
+
depth: { maximum: 7, minimum: 0, type: 'integer' },
|
|
145
|
+
mode: { enum: ['all', 'any'], type: 'string' },
|
|
146
|
+
name: { maxLength: 4, minLength: 2, pattern: '^[a-z]+$', patternSource: '/^[a-z]+$/' },
|
|
147
|
+
store: { required: true, type: 'string' },
|
|
148
|
+
tags: { maxLength: 3, type: 'string' },
|
|
149
|
+
};
|
|
150
|
+
const at = (form: Record<string, string | readonly string[]>, presence = false) =>
|
|
151
|
+
violations(table, form, { presence });
|
|
152
|
+
|
|
153
|
+
test('maxLength: 4 passes, 5 does not', () => {
|
|
154
|
+
expect(at({ name: 'abcd' })).toEqual([]);
|
|
155
|
+
expect(at({ name: 'abcde' })).toEqual(['name: at most 4 characters']);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test('minLength: 2 passes, 1 does not', () => {
|
|
159
|
+
expect(at({ name: 'ab' })).toEqual([]);
|
|
160
|
+
expect(at({ name: 'a' })).toEqual(['name: at least 2 characters']);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test('minimum and maximum are inclusive on both sides', () => {
|
|
164
|
+
expect(at({ depth: '0' })).toEqual([]);
|
|
165
|
+
expect(at({ depth: '7' })).toEqual([]);
|
|
166
|
+
expect(at({ depth: '-1' })).toEqual(['depth: at least 0']);
|
|
167
|
+
expect(at({ depth: '8' })).toEqual(['depth: at most 7']);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test('enum quotes the vendor own members', () => {
|
|
171
|
+
expect(at({ mode: 'any' })).toEqual([]);
|
|
172
|
+
expect(at({ mode: 'ALL' })).toEqual(['mode: must be one of all, any']);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('pattern reports the VENDOR spelling, not the translated one', () => {
|
|
176
|
+
expect(at({ name: 'abc' })).toEqual([]);
|
|
177
|
+
expect(at({ name: 'ab1' })).toEqual(['name: must match /^[a-z]+$/']);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('required is checked only when presence is asked for — an update form is partial', () => {
|
|
181
|
+
expect(at({})).toEqual([]);
|
|
182
|
+
expect(at({}, true)).toEqual(['store: required']);
|
|
183
|
+
expect(at({ store: 'r2' }, true)).toEqual([]);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
/** ⚠️ Characters, not UTF-16 code units: an astral character is ONE character to Proxmox. */
|
|
187
|
+
test('length counts characters, so an astral character is one', () => {
|
|
188
|
+
expect(at({ tags: `${ROCKET}ab` })).toEqual([]);
|
|
189
|
+
expect(at({ tags: `${ROCKET}abc` })).toEqual(['tags: at most 3 characters']);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
/** ⚠️ A list is repeated keys on the wire (client.ts), so every element faces the same rule. */
|
|
193
|
+
test('every element of an array value is checked', () => {
|
|
194
|
+
expect(at({ tags: ['ab', 'abcd'] })).toEqual(['tags: at most 3 characters']);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test('a key the table does not mention is not an error', () => {
|
|
198
|
+
expect(at({ unlisted: 'anything at all' })).toEqual([]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('the refusal names the endpoint and points at the generated table', () => {
|
|
202
|
+
expect(refusal(VERIFY, ['comment: at most 128 characters'])).toContain(VERIFY);
|
|
203
|
+
expect(refusal(VERIFY, ['comment: at most 128 characters'])).toContain('generated/constraints');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The vendor's own rules, checked here, before the request is built.
|
|
3
|
+
*
|
|
4
|
+
* 🔴 THE INCIDENT THIS EXISTS FOR, 2026-09-22. `homeflare-proxmox`'s first `deploy:pbs` adopted ten
|
|
5
|
+
* objects and then failed its one create: `PVE POST config/verify -> 400: parameter verification
|
|
6
|
+
* failed - comment: value may only be 128 characters long`. Half a deploy in, on the server, from
|
|
7
|
+
* a limit PBS publishes in its own schema and the generated `comment?: string` does not carry.
|
|
8
|
+
* Plan was green. `bun run check` was green. `hf-adopt-verify` was green — its offline fake serves
|
|
9
|
+
* a fixture and refuses anything but GET, so a newly declared object's VALUES are never exercised.
|
|
10
|
+
*
|
|
11
|
+
* ★ SO THE TABLE IS GENERATED AND THIS FILE IS THE READER. `generated/constraints/*` is emitted
|
|
12
|
+
* from the cluster's own `apidoc.js` by `bun codegen/constraints.ts`; nothing here is hand-typed,
|
|
13
|
+
* because a hand-typed limit is the tribal knowledge that was already in a doc comment and
|
|
14
|
+
* already did not run.
|
|
15
|
+
*
|
|
16
|
+
* ⛔ IT CHECKS THE FORM, NOT THE PROPS, AND THAT IS THE WHOLE POINT. The form is what goes on the
|
|
17
|
+
* wire: `String(props['max-depth'])`, `'0' | '1'` for a boolean, an omitted key for an undeclared
|
|
18
|
+
* field. A props-level check would pass values the form then mangles, and would have to be
|
|
19
|
+
* written once per family — which is how the copy that forgets a field gets written.
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ WHAT IT DELIBERATELY DOES NOT ENFORCE, so nobody reads a green plan as more than it is. The
|
|
22
|
+
* full kind-by-kind table, with the counts measured over the 37 tabled endpoints, is in
|
|
23
|
+
* codegen/README.md. The short version:
|
|
24
|
+
* - a `format` NAME (PVE's `pve-calendar-event`, `pve-node`; 105 parameters here): the name is a
|
|
25
|
+
* validator PVE implements server-side and publishes nothing about. Recorded, never checked.
|
|
26
|
+
* - a `format` OBJECT — PBS's `notify`, `tuning`, `maintenance-mode`, PVE's `bwlimit`; 10
|
|
27
|
+
* parameters. It is a sub-schema for the inside of a PROPERTY STRING, and the packed keys
|
|
28
|
+
* carry their own limits. Not flattened, because a rule about `notify` is not a rule about
|
|
29
|
+
* `notify.gc`. ⛔ This is the largest remaining gap and it is a gap on purpose.
|
|
30
|
+
* - `requires` (8 parameters): "this one needs that one". A dependency, not a value rule.
|
|
31
|
+
* - `typetext` with nothing else, such as PBS `schedule`'s `<calendar-event>` (21 parameters).
|
|
32
|
+
* The schema states a syntax it does not describe; a malformed schedule still reaches PBS.
|
|
33
|
+
* - a pattern the generator could not translate faithfully (codegen/pattern.ts). Recorded
|
|
34
|
+
* verbatim as `patternSource`, never checked.
|
|
35
|
+
* Each of those is a fact in the table rather than a guess, which is the rule this follows:
|
|
36
|
+
* if the vendor did not state it, it is not enforced and the table says so.
|
|
37
|
+
*/
|
|
38
|
+
import type { PveForm } from './client.ts';
|
|
39
|
+
|
|
40
|
+
export interface ParamConstraint {
|
|
41
|
+
readonly type?: string;
|
|
42
|
+
/** From the vendor's `optional`. ⚠️ Checked on CREATE only — see `violations`. */
|
|
43
|
+
readonly required?: boolean;
|
|
44
|
+
readonly maxLength?: number;
|
|
45
|
+
readonly minLength?: number;
|
|
46
|
+
readonly minimum?: number;
|
|
47
|
+
readonly maximum?: number;
|
|
48
|
+
readonly enum?: readonly string[];
|
|
49
|
+
/**
|
|
50
|
+
* A JavaScript-safe EQUIVALENT. Absent when the vendor's dialect could not be carried over.
|
|
51
|
+
*
|
|
52
|
+
* ⛔ NOT THE VENDOR'S SPELLING, AND FOR PVE NOT EVEN THE SAME SHAPE. PVE publishes the inside of
|
|
53
|
+
* an anchored match and applies `m/^$pattern$/` itself (MEASURED in JSONSchema.pm), so the
|
|
54
|
+
* generator anchors it here. Quote `patternSource` at a human, never this.
|
|
55
|
+
*/
|
|
56
|
+
readonly pattern?: string;
|
|
57
|
+
/** `m` when the vendor asked for multi-line. ⚠️ Dropping it enforces the wrong semantics. */
|
|
58
|
+
readonly patternFlags?: string;
|
|
59
|
+
/** The vendor's own spelling, always — what a violation message quotes, and the audit trail. */
|
|
60
|
+
readonly patternSource?: string;
|
|
61
|
+
/** PVE's server-side validator name. Recorded so a reader knows what is NOT checked here. */
|
|
62
|
+
readonly format?: string;
|
|
63
|
+
readonly default?: string;
|
|
64
|
+
/**
|
|
65
|
+
* The value rules describe each ELEMENT of a repeated key, not one joined string.
|
|
66
|
+
*
|
|
67
|
+
* ⚠️ RECORDED, NOT BRANCHED ON. `violations` already checks every element of an array value, so
|
|
68
|
+
* this changes no behaviour — it tells a reader of the generated table why a `maxLength` of 32
|
|
69
|
+
* sits on a parameter that carries a list.
|
|
70
|
+
*/
|
|
71
|
+
readonly each?: true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type EndpointConstraints = Readonly<Record<string, ParamConstraint>>;
|
|
75
|
+
|
|
76
|
+
/** `POST /config/verify` — exactly how the generated tables key an endpoint. */
|
|
77
|
+
export type EndpointKey = string;
|
|
78
|
+
|
|
79
|
+
export interface ViolationOptions {
|
|
80
|
+
/**
|
|
81
|
+
* Check that every vendor-required parameter is present.
|
|
82
|
+
*
|
|
83
|
+
* ⛔ CREATE ONLY. An update form is deliberately PARTIAL — `formToSend` sends the fields that
|
|
84
|
+
* changed and nothing else — so requiring presence there would refuse every ordinary edit.
|
|
85
|
+
*/
|
|
86
|
+
readonly presence?: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const lengthOf = (value: string): number => [...value].length;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* ⚠️ `[...value].length`, NOT `value.length`. Proxmox counts characters; JavaScript counts UTF-16
|
|
93
|
+
* code units, so an emoji in a comment counts twice and a 128-character limit would refuse a
|
|
94
|
+
* comment PBS accepts. Rejecting a legal value at plan time is the one failure mode worse than
|
|
95
|
+
* the server 400 this replaces.
|
|
96
|
+
*/
|
|
97
|
+
const checkValue = (name: string, value: string, rule: ParamConstraint): string[] => {
|
|
98
|
+
const out: string[] = [];
|
|
99
|
+
if (rule.maxLength !== undefined && lengthOf(value) > rule.maxLength) {
|
|
100
|
+
out.push(`${name}: at most ${rule.maxLength} characters`);
|
|
101
|
+
}
|
|
102
|
+
if (rule.minLength !== undefined && lengthOf(value) < rule.minLength) {
|
|
103
|
+
out.push(`${name}: at least ${rule.minLength} characters`);
|
|
104
|
+
}
|
|
105
|
+
if (rule.enum !== undefined && !rule.enum.includes(value)) {
|
|
106
|
+
out.push(`${name}: must be one of ${rule.enum.join(', ')}`);
|
|
107
|
+
}
|
|
108
|
+
// ⚠️ `patternFlags` IS PASSED, NOT IGNORED. It carries the vendor's own `(?m)`; enforcing a
|
|
109
|
+
// multi-line rule with single-line semantics refuses values the vendor accepts.
|
|
110
|
+
if (rule.pattern !== undefined && !new RegExp(rule.pattern, rule.patternFlags).test(value)) {
|
|
111
|
+
out.push(`${name}: must match ${rule.patternSource ?? rule.pattern}`);
|
|
112
|
+
}
|
|
113
|
+
// ⚠️ NUMBER-NESS IS NOT CHECKED, ONLY THE BOUND. The form is strings by construction and a
|
|
114
|
+
// non-numeric string is a type error upstream; `Number('')` is 0, so a blank would read as in
|
|
115
|
+
// range. Guarding on Number.isFinite keeps a blank from silently passing a minimum of 0.
|
|
116
|
+
const numeric = Number(value);
|
|
117
|
+
const bounded = rule.minimum !== undefined || rule.maximum !== undefined;
|
|
118
|
+
if (bounded && value !== '' && Number.isFinite(numeric)) {
|
|
119
|
+
if (rule.minimum !== undefined && numeric < rule.minimum) {
|
|
120
|
+
out.push(`${name}: at least ${rule.minimum}`);
|
|
121
|
+
}
|
|
122
|
+
if (rule.maximum !== undefined && numeric > rule.maximum) {
|
|
123
|
+
out.push(`${name}: at most ${rule.maximum}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return out;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Every vendor rule this form breaks, in the order the parameters are declared. Pure: no network,
|
|
131
|
+
* no clock, no environment — so `diff` can call it and a test can call it with a literal.
|
|
132
|
+
*
|
|
133
|
+
* ⚠️ A KEY THE TABLE DOES NOT MENTION IS NOT AN ERROR. The table carries the constrained
|
|
134
|
+
* parameters, not every parameter, and a form may legitimately send an unconstrained one.
|
|
135
|
+
*/
|
|
136
|
+
export const violations = (
|
|
137
|
+
table: EndpointConstraints,
|
|
138
|
+
form: PveForm,
|
|
139
|
+
options: ViolationOptions = {},
|
|
140
|
+
): readonly string[] => {
|
|
141
|
+
const out: string[] = [];
|
|
142
|
+
for (const [name, rule] of Object.entries(table)) {
|
|
143
|
+
const value = form[name];
|
|
144
|
+
if (value === undefined) {
|
|
145
|
+
if (options.presence === true && rule.required === true) out.push(`${name}: required`);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// ⚠️ AN ARRAY IS REPEATED KEYS ON THE WIRE (client.ts), so every element faces the same rule.
|
|
149
|
+
for (const item of typeof value === 'string' ? [value] : value) {
|
|
150
|
+
out.push(...checkValue(name, item, rule));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return out;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/** The message a plan dies with. ⛔ Names the endpoint, because the rule belongs to the vendor. */
|
|
157
|
+
export const refusal = (endpoint: EndpointKey, found: readonly string[]): string =>
|
|
158
|
+
`${endpoint} would be rejected by the vendor:\n - ${found.join('\n - ')}\n` +
|
|
159
|
+
"These are the vendor's own limits, read from its published schema " +
|
|
160
|
+
'(packages/alchemy/src/proxmox/generated/constraints). Fix the declaration.';
|
|
@@ -171,6 +171,11 @@ const handlers = pveHandlers<FirewallAliasProps, FirewallAliasAttributes>({
|
|
|
171
171
|
* is identity and case-only drift (see the header); `ipversion` is derived and unwritable.
|
|
172
172
|
* Comparing either would report an update that no update can settle.
|
|
173
173
|
*/
|
|
174
|
+
/** The vendor rules these forms are checked against at plan time — resource-spec.ts. */
|
|
175
|
+
endpoint: {
|
|
176
|
+
create: 'pve:POST /cluster/firewall/aliases',
|
|
177
|
+
update: 'pve:PUT /cluster/firewall/aliases/{name}',
|
|
178
|
+
},
|
|
174
179
|
matches: (attributes, props) =>
|
|
175
180
|
attributes.cidr === cidr(props.cidr) && attributes.comment === comment(props.comment),
|
|
176
181
|
/**
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every generated Proxmox constraint table, merged — DO NOT EDIT BY HAND.
|
|
3
|
+
*
|
|
4
|
+
* Run: bun codegen/constraints.ts
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ MERGING IS SAFE ONLY BECAUSE EVERY KEY IS PREFIXED `pve:`/`pbs:`. PVE and PBS both publish
|
|
7
|
+
* `PUT /access/acl` and `PUT /access/password` with DIFFERENT rules; an unprefixed merge would
|
|
8
|
+
* silently enforce one product's limits on the other's objects.
|
|
9
|
+
*/
|
|
10
|
+
import type { EndpointConstraints } from '../../constraints.ts';
|
|
11
|
+
import { PVE_ACCESS_CONSTRAINTS } from './pve-access.ts';
|
|
12
|
+
import { PVE_CLUSTER_BACKUP_CONSTRAINTS } from './pve-cluster-backup.ts';
|
|
13
|
+
import { PVE_CLUSTER_CEPH_CONSTRAINTS } from './pve-cluster-ceph.ts';
|
|
14
|
+
import { PVE_CLUSTER_FIREWALL_CONSTRAINTS } from './pve-cluster-firewall.ts';
|
|
15
|
+
import { PVE_CLUSTER_HA_CONSTRAINTS } from './pve-cluster-ha.ts';
|
|
16
|
+
import { PVE_CLUSTER_METRICS_CONSTRAINTS } from './pve-cluster-metrics.ts';
|
|
17
|
+
import { PVE_CLUSTER_NOTIFICATIONS_CONSTRAINTS } from './pve-cluster-notifications.ts';
|
|
18
|
+
import { PVE_CLUSTER_REPLICATION_CONSTRAINTS } from './pve-cluster-replication.ts';
|
|
19
|
+
import { PVE_CLUSTER_SDN_CONSTRAINTS } from './pve-cluster-sdn.ts';
|
|
20
|
+
import { PVE_NODES_CEPH_CONSTRAINTS } from './pve-nodes-ceph.ts';
|
|
21
|
+
import { PVE_NODES_DISKS_CONSTRAINTS } from './pve-nodes-disks.ts';
|
|
22
|
+
import { PVE_NODES_LXC_CONSTRAINTS } from './pve-nodes-lxc.ts';
|
|
23
|
+
import { PVE_NODES_NETWORK_CONSTRAINTS } from './pve-nodes-network.ts';
|
|
24
|
+
import { PVE_NODES_QEMU_CONSTRAINTS } from './pve-nodes-qemu.ts';
|
|
25
|
+
import { PVE_POOLS_CONSTRAINTS } from './pve-pools.ts';
|
|
26
|
+
import { PVE_STORAGE_CONSTRAINTS } from './pve-storage.ts';
|
|
27
|
+
import { PBS_CONFIG_CONSTRAINTS } from './pbs-config.ts';
|
|
28
|
+
|
|
29
|
+
export const PROXMOX_CONSTRAINTS: Readonly<Record<string, EndpointConstraints>> = {
|
|
30
|
+
...PVE_ACCESS_CONSTRAINTS,
|
|
31
|
+
...PVE_CLUSTER_BACKUP_CONSTRAINTS,
|
|
32
|
+
...PVE_CLUSTER_CEPH_CONSTRAINTS,
|
|
33
|
+
...PVE_CLUSTER_FIREWALL_CONSTRAINTS,
|
|
34
|
+
...PVE_CLUSTER_HA_CONSTRAINTS,
|
|
35
|
+
...PVE_CLUSTER_METRICS_CONSTRAINTS,
|
|
36
|
+
...PVE_CLUSTER_NOTIFICATIONS_CONSTRAINTS,
|
|
37
|
+
...PVE_CLUSTER_REPLICATION_CONSTRAINTS,
|
|
38
|
+
...PVE_CLUSTER_SDN_CONSTRAINTS,
|
|
39
|
+
...PVE_NODES_CEPH_CONSTRAINTS,
|
|
40
|
+
...PVE_NODES_DISKS_CONSTRAINTS,
|
|
41
|
+
...PVE_NODES_LXC_CONSTRAINTS,
|
|
42
|
+
...PVE_NODES_NETWORK_CONSTRAINTS,
|
|
43
|
+
...PVE_NODES_QEMU_CONSTRAINTS,
|
|
44
|
+
...PVE_POOLS_CONSTRAINTS,
|
|
45
|
+
...PVE_STORAGE_CONSTRAINTS,
|
|
46
|
+
...PBS_CONFIG_CONSTRAINTS,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* sha256 of the merged table, truncated.
|
|
51
|
+
*
|
|
52
|
+
* ★ A DIGEST OF THE DATA, NOT OF THE FILE TEXT, so reformatting is not a stale generation while
|
|
53
|
+
* changing a 128 to a 129 by hand is. `tests/schema-manifest.test.ts` recomputes it.
|
|
54
|
+
*/
|
|
55
|
+
export const PROXMOX_CONSTRAINTS_DIGEST = '33b42b52d396c9e0';
|