From 3eeb303dcb7f4abc00399b5b10393aac38f0e7c1 Mon Sep 17 00:00:00 2001
From: centra
Date: Sat, 13 Dec 2025 04:34:51 +0900
Subject: [PATCH] feat: Batch commit for T039.S3 deployment
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Includes all pending changes needed for nixos-anywhere:
- fiberlb: L7 policy, rule, certificate types
- deployer: New service for cluster management
- nix-nos: Generic network modules
- Various service updates and fixes
ð€ Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5
---
.TOAGENT.md.kate-swp | Bin 5783 -> 0 bytes
.gitignore | 3 +
Nix-NOS.md | 398 ++
PROJECT.md | 6 +-
TOAGENT.md | 2 +-
.../vm-cluster/launch-node01-from-disk.sh | 66 +
.../vm-cluster/launch-node02-from-disk.sh | 66 +
.../vm-cluster/launch-node03-from-disk.sh | 66 +
chainfire/Cargo.lock | 461 +--
chainfire/Cargo.toml | 4 -
chainfire/chainfire-client/src/client.rs | 4 +-
chainfire/chainfire-client/src/lib.rs | 2 +-
chainfire/chainfire-client/src/node.rs | 2 +-
chainfire/crates/chainfire-api/Cargo.toml | 4 -
.../crates/chainfire-api/src/raft_client.rs | 206 +-
chainfire/crates/chainfire-core/Cargo.toml | 4 +-
.../crates/chainfire-core/src/builder.rs | 21 +-
.../crates/chainfire-core/src/cluster.rs | 63 +-
chainfire/crates/chainfire-raft/Cargo.toml | 4 +-
chainfire/crates/chainfire-raft/src/config.rs | 79 -
chainfire/crates/chainfire-raft/src/core.rs | 4 +-
chainfire/crates/chainfire-raft/src/lib.rs | 32 +-
.../crates/chainfire-raft/src/network.rs | 324 +-
chainfire/crates/chainfire-raft/src/node.rs | 326 --
.../crates/chainfire-raft/src/storage.rs | 475 ---
chainfire/crates/chainfire-server/Cargo.toml | 5 +
.../crates/chainfire-server/src/config.rs | 8 +
chainfire/crates/chainfire-server/src/lib.rs | 2 +
chainfire/crates/chainfire-server/src/rest.rs | 306 ++
.../crates/chainfire-server/src/server.rs | 33 +-
.../tests/integration_test.rs | 22 +-
.../crates/chainfire-storage/src/kv_store.rs | 2 -
.../chainfire-storage/src/lease_store.rs | 2 +-
.../chainfire-storage/src/log_storage.rs | 6 +-
.../crates/chainfire-types/src/command.rs | 7 +-
chainfire/crates/chainfire-types/src/kv.rs | 13 +-
chainfire/crates/chainfire-types/src/node.rs | 7 +-
.../crates/chainfire-watch/src/registry.rs | 2 +-
chainfire/data/CURRENT | 1 +
chainfire/data/IDENTITY | 1 +
chainfire/data/LOCK | 0
chainfire/data/LOG | 3410 +++++++++++++++++
chainfire/data/MANIFEST-000005 | Bin 0 -> 355 bytes
chainfire/data/OPTIONS-000007 | 684 ++++
creditservice/Cargo.lock | 83 +-
.../creditservice-api/src/credit_service.rs | 1 +
.../crates/creditservice-server/Cargo.toml | 7 +
.../crates/creditservice-server/src/main.rs | 48 +-
.../crates/creditservice-server/src/rest.rs | 429 +++
.../creditservice-types/src/reservation.rs | 7 +-
.../crates/creditservice-types/src/wallet.rs | 7 +-
deployer/Cargo.lock | 1946 ++++++++++
deployer/Cargo.toml | 32 +
deployer/crates/deployer-server/Cargo.toml | 33 +
deployer/crates/deployer-server/src/admin.rs | 238 ++
deployer/crates/deployer-server/src/config.rs | 93 +
deployer/crates/deployer-server/src/lib.rs | 85 +
deployer/crates/deployer-server/src/main.rs | 24 +
.../crates/deployer-server/src/phone_home.rs | 308 ++
deployer/crates/deployer-server/src/state.rs | 83 +
.../crates/deployer-server/src/storage.rs | 242 ++
deployer/crates/deployer-types/Cargo.toml | 13 +
deployer/crates/deployer-types/src/lib.rs | 175 +
docs/api/rest-api-guide.md | 1197 ++++++
docs/por/POR.md | 106 +-
docs/por/T029-practical-app-demo/Cargo.lock | 2974 ++++++++++++++
.../S6-integration-test-plan.md | 245 ++
docs/por/T039-production-deployment/task.yaml | 39 +-
docs/por/T050-rest-api/task.yaml | 431 ++-
docs/por/T051-fiberlb-integration/task.yaml | 73 +-
.../T052-creditservice-persistence/task.yaml | 32 +-
.../task.yaml | 73 +-
docs/por/T054-plasmavmc-ops/task.yaml | 143 +-
.../S2-l7-loadbalancing-spec.md | 808 ++++
.../S3-bgp-integration-spec.md | 369 ++
docs/por/T055-fiberlb-features/task.yaml | 207 +-
docs/por/T056-flashdns-pagination/task.yaml | 40 +-
.../S1-ipam-spec.md | 328 ++
.../task.yaml | 100 +-
docs/por/T059-audit-fix/task.yaml | 8 +-
docs/por/T061-deployer-nixnos/task.yaml | 219 ++
docs/por/T062-nix-nos-generic/task.yaml | 191 +
docs/por/scope.yaml | 4 +-
fiberlb/Cargo.lock | 170 +-
.../crates/fiberlb-api/proto/fiberlb.proto | 249 ++
fiberlb/crates/fiberlb-server/Cargo.toml | 13 +
.../crates/fiberlb-server/src/bgp_client.rs | 228 ++
.../crates/fiberlb-server/src/dataplane.rs | 64 +-
.../crates/fiberlb-server/src/l7_dataplane.rs | 237 ++
.../crates/fiberlb-server/src/l7_router.rs | 223 ++
fiberlb/crates/fiberlb-server/src/lib.rs | 8 +
fiberlb/crates/fiberlb-server/src/maglev.rs | 352 ++
fiberlb/crates/fiberlb-server/src/main.rs | 21 +-
fiberlb/crates/fiberlb-server/src/metadata.rs | 253 +-
.../src/services/certificate.rs | 220 ++
.../fiberlb-server/src/services/l7_policy.rs | 283 ++
.../fiberlb-server/src/services/l7_rule.rs | 280 ++
.../crates/fiberlb-server/src/services/mod.rs | 6 +
.../fiberlb-server/src/services/pool.rs | 1 +
fiberlb/crates/fiberlb-server/src/tls.rs | 211 +
.../crates/fiberlb-server/src/vip_manager.rs | 307 ++
.../fiberlb-server/tests/integration.rs | 343 +-
fiberlb/crates/fiberlb-types/src/backend.rs | 14 +-
.../crates/fiberlb-types/src/certificate.rs | 120 +
fiberlb/crates/fiberlb-types/src/health.rs | 7 +-
fiberlb/crates/fiberlb-types/src/l7policy.rs | 124 +
fiberlb/crates/fiberlb-types/src/l7rule.rs | 139 +
fiberlb/crates/fiberlb-types/src/lib.rs | 6 +
fiberlb/crates/fiberlb-types/src/listener.rs | 14 +-
.../crates/fiberlb-types/src/loadbalancer.rs | 7 +-
fiberlb/crates/fiberlb-types/src/pool.rs | 16 +-
flake.lock | 23 +-
flake.nix | 21 +-
flaredb/Cargo.lock | 105 +-
flaredb/crates/flaredb-client/src/client.rs | 2 +-
flaredb/crates/flaredb-server/Cargo.toml | 5 +
.../crates/flaredb-server/src/config/mod.rs | 9 +-
flaredb/crates/flaredb-server/src/lib.rs | 1 +
flaredb/crates/flaredb-server/src/main.rs | 39 +-
flaredb/crates/flaredb-server/src/merkle.rs | 5 +-
.../crates/flaredb-server/src/pd_client.rs | 1 -
.../crates/flaredb-server/src/raft_service.rs | 2 +-
flaredb/crates/flaredb-server/src/rest.rs | 265 ++
flaredb/crates/flaredb-server/src/service.rs | 4 +-
.../crates/flaredb-server/src/sql_service.rs | 2 +-
flaredb/crates/flaredb-server/src/store.rs | 4 +-
flaredb/crates/flaredb-sql/src/metadata.rs | 4 +-
flashdns/Cargo.lock | 1 +
flashdns/crates/flashdns-server/Cargo.toml | 1 +
flashdns/crates/flashdns-server/src/config.rs | 2 +-
.../crates/flashdns-server/src/dns/handler.rs | 5 +-
flashdns/crates/flashdns-server/src/main.rs | 1 -
.../crates/flashdns-server/src/metadata.rs | 2 +-
.../flashdns-server/src/record_service.rs | 47 +-
.../flashdns-server/src/zone_service.rs | 47 +-
.../flashdns-server/tests/integration.rs | 215 ++
iam/Cargo.lock | 81 +-
iam/crates/iam-api/build.rs | 2 +-
iam/crates/iam-api/src/conversions.rs | 11 +-
iam/crates/iam-api/src/iam_service.rs | 5 +-
iam/crates/iam-api/src/token_service.rs | 25 +-
.../iam-api/tests/tenant_path_integration.rs | 132 +-
iam/crates/iam-audit/src/event.rs | 30 +-
iam/crates/iam-authn/src/lib.rs | 4 +-
iam/crates/iam-authn/src/token.rs | 6 +-
iam/crates/iam-authz/src/condition.rs | 1 -
iam/crates/iam-authz/src/context.rs | 8 +-
iam/crates/iam-authz/src/evaluator.rs | 16 +-
iam/crates/iam-client/src/client.rs | 3 +-
iam/crates/iam-server/Cargo.toml | 6 +
iam/crates/iam-server/src/config.rs | 40 +-
iam/crates/iam-server/src/main.rs | 38 +-
iam/crates/iam-server/src/rest.rs | 382 ++
iam/crates/iam-store/src/backend.rs | 10 +-
iam/crates/iam-store/src/binding_store.rs | 1 -
iam/crates/iam-types/src/condition.rs | 4 +-
iam/crates/iam-types/src/policy.rs | 2 +-
iam/crates/iam-types/src/scope.rs | 35 +-
iam/crates/iam-types/src/token.rs | 2 +-
k8shost/Cargo.lock | 83 +-
k8shost/crates/k8shost-csi/src/main.rs | 1 -
k8shost/crates/k8shost-server/Cargo.toml | 4 +
k8shost/crates/k8shost-server/src/config.rs | 34 +-
.../crates/k8shost-server/src/ipam_client.rs | 98 +
k8shost/crates/k8shost-server/src/lib.rs | 4 +
k8shost/crates/k8shost-server/src/main.rs | 67 +-
k8shost/crates/k8shost-server/src/rest.rs | 443 +++
.../crates/k8shost-server/src/scheduler.rs | 233 +-
.../k8shost-server/src/services/node.rs | 3 +-
.../crates/k8shost-server/src/services/pod.rs | 3 +-
.../k8shost-server/src/services/service.rs | 74 +-
.../k8shost-server/src/services/tests.rs | 18 +-
k8shost/crates/k8shost-server/src/storage.rs | 35 +
.../src/object_service.rs | 1 -
.../lightningstor-server/src/s3/router.rs | 3 +-
.../crates/lightningstor-types/src/bucket.rs | 10 +-
.../crates/lightningstor-types/src/object.rs | 2 +-
.../crates/nightlight-server/src/query.rs | 4 +-
.../crates/nightlight-server/src/storage.rs | 2 +-
nix-nos/README.md | 165 +
nix-nos/examples/datacenter-node.nix | 55 +
nix-nos/examples/edge-router.nix | 52 +
nix-nos/examples/home-router.nix | 41 +
nix-nos/flake.lock | 27 +
nix-nos/flake.nix | 62 +
nix-nos/lib/generators.nix | 94 +
nix-nos/modules/bgp/bird.nix | 74 +
nix-nos/modules/bgp/default.nix | 103 +
nix-nos/modules/bgp/gobgp.nix | 90 +
nix-nos/modules/default.nix | 31 +
nix-nos/modules/network/interfaces.nix | 193 +
nix-nos/modules/network/vlans.nix | 137 +
nix-nos/modules/routing/static.nix | 73 +
nix/ci/flake.lock | 82 +
nix/ci/flake.nix | 248 ++
nix/iso/plasmacloud-iso.nix | 92 +
nix/modules/first-boot-automation.nix | 56 +-
.../nix-nos/cluster-config-generator.nix | 65 +
nix/modules/nix-nos/example-topology.nix | 94 +
nix/modules/nix-nos/topology.nix | 148 +
nix/modules/plasmacloud-cluster.nix | 162 +
nix/modules/plasmacloud-network.nix | 124 +
plasmavmc/Cargo.lock | 78 +-
.../crates/plasmavmc-firecracker/src/lib.rs | 4 +-
plasmavmc/crates/plasmavmc-kvm/src/lib.rs | 156 +-
plasmavmc/crates/plasmavmc-server/Cargo.toml | 5 +
.../crates/plasmavmc-server/src/config.rs | 32 +-
plasmavmc/crates/plasmavmc-server/src/lib.rs | 2 +
plasmavmc/crates/plasmavmc-server/src/main.rs | 40 +-
plasmavmc/crates/plasmavmc-server/src/rest.rs | 314 ++
.../crates/plasmavmc-server/src/storage.rs | 2 +-
.../crates/plasmavmc-server/src/vm_service.rs | 192 +-
.../crates/plasmavmc-server/src/watcher.rs | 325 ++
.../crates/plasmavmc-types/src/config.rs | 22 +-
plasmavmc/crates/plasmavmc-types/src/vm.rs | 13 +-
prismnet/Cargo.lock | 210 +-
.../crates/prismnet-api/proto/prismnet.proto | 132 +
prismnet/crates/prismnet-server/Cargo.toml | 4 +
prismnet/crates/prismnet-server/src/config.rs | 9 +
prismnet/crates/prismnet-server/src/lib.rs | 5 +-
prismnet/crates/prismnet-server/src/main.rs | 51 +-
.../crates/prismnet-server/src/metadata.rs | 165 +-
prismnet/crates/prismnet-server/src/rest.rs | 402 ++
.../prismnet-server/src/services/ipam.rs | 322 ++
.../prismnet-server/src/services/mod.rs | 2 +
.../prismnet-server/src/services/subnet.rs | 1 +
.../prismnet-server/src/services/vpc.rs | 1 +
prismnet/crates/prismnet-types/src/lib.rs | 4 +-
prismnet/crates/prismnet-types/src/port.rs | 14 +-
.../prismnet-types/src/security_group.rs | 7 +-
.../prismnet-types/src/service_ip_pool.rs | 262 ++
prismnet/crates/prismnet-types/src/subnet.rs | 7 +-
prismnet/crates/prismnet-types/src/vpc.rs | 7 +-
233 files changed, 27650 insertions(+), 2677 deletions(-)
delete mode 100644 .TOAGENT.md.kate-swp
create mode 100644 Nix-NOS.md
create mode 100755 baremetal/vm-cluster/launch-node01-from-disk.sh
create mode 100755 baremetal/vm-cluster/launch-node02-from-disk.sh
create mode 100755 baremetal/vm-cluster/launch-node03-from-disk.sh
delete mode 100644 chainfire/crates/chainfire-raft/src/config.rs
delete mode 100644 chainfire/crates/chainfire-raft/src/node.rs
delete mode 100644 chainfire/crates/chainfire-raft/src/storage.rs
create mode 100644 chainfire/crates/chainfire-server/src/rest.rs
create mode 100644 chainfire/data/CURRENT
create mode 100644 chainfire/data/IDENTITY
create mode 100644 chainfire/data/LOCK
create mode 100644 chainfire/data/LOG
create mode 100644 chainfire/data/MANIFEST-000005
create mode 100644 chainfire/data/OPTIONS-000007
create mode 100644 creditservice/crates/creditservice-server/src/rest.rs
create mode 100644 deployer/Cargo.lock
create mode 100644 deployer/Cargo.toml
create mode 100644 deployer/crates/deployer-server/Cargo.toml
create mode 100644 deployer/crates/deployer-server/src/admin.rs
create mode 100644 deployer/crates/deployer-server/src/config.rs
create mode 100644 deployer/crates/deployer-server/src/lib.rs
create mode 100644 deployer/crates/deployer-server/src/main.rs
create mode 100644 deployer/crates/deployer-server/src/phone_home.rs
create mode 100644 deployer/crates/deployer-server/src/state.rs
create mode 100644 deployer/crates/deployer-server/src/storage.rs
create mode 100644 deployer/crates/deployer-types/Cargo.toml
create mode 100644 deployer/crates/deployer-types/src/lib.rs
create mode 100644 docs/api/rest-api-guide.md
create mode 100644 docs/por/T029-practical-app-demo/Cargo.lock
create mode 100644 docs/por/T039-production-deployment/S6-integration-test-plan.md
create mode 100644 docs/por/T055-fiberlb-features/S2-l7-loadbalancing-spec.md
create mode 100644 docs/por/T055-fiberlb-features/S3-bgp-integration-spec.md
create mode 100644 docs/por/T057-k8shost-resource-management/S1-ipam-spec.md
create mode 100644 docs/por/T061-deployer-nixnos/task.yaml
create mode 100644 docs/por/T062-nix-nos-generic/task.yaml
create mode 100644 fiberlb/crates/fiberlb-server/src/bgp_client.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/l7_dataplane.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/l7_router.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/maglev.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/services/certificate.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/services/l7_policy.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/services/l7_rule.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/tls.rs
create mode 100644 fiberlb/crates/fiberlb-server/src/vip_manager.rs
create mode 100644 fiberlb/crates/fiberlb-types/src/certificate.rs
create mode 100644 fiberlb/crates/fiberlb-types/src/l7policy.rs
create mode 100644 fiberlb/crates/fiberlb-types/src/l7rule.rs
create mode 100644 flaredb/crates/flaredb-server/src/rest.rs
create mode 100644 iam/crates/iam-server/src/rest.rs
create mode 100644 k8shost/crates/k8shost-server/src/ipam_client.rs
create mode 100644 k8shost/crates/k8shost-server/src/rest.rs
create mode 100644 nix-nos/README.md
create mode 100644 nix-nos/examples/datacenter-node.nix
create mode 100644 nix-nos/examples/edge-router.nix
create mode 100644 nix-nos/examples/home-router.nix
create mode 100644 nix-nos/flake.lock
create mode 100644 nix-nos/flake.nix
create mode 100644 nix-nos/lib/generators.nix
create mode 100644 nix-nos/modules/bgp/bird.nix
create mode 100644 nix-nos/modules/bgp/default.nix
create mode 100644 nix-nos/modules/bgp/gobgp.nix
create mode 100644 nix-nos/modules/default.nix
create mode 100644 nix-nos/modules/network/interfaces.nix
create mode 100644 nix-nos/modules/network/vlans.nix
create mode 100644 nix-nos/modules/routing/static.nix
create mode 100644 nix/ci/flake.lock
create mode 100644 nix/ci/flake.nix
create mode 100644 nix/iso/plasmacloud-iso.nix
create mode 100644 nix/modules/nix-nos/cluster-config-generator.nix
create mode 100644 nix/modules/nix-nos/example-topology.nix
create mode 100644 nix/modules/nix-nos/topology.nix
create mode 100644 nix/modules/plasmacloud-cluster.nix
create mode 100644 nix/modules/plasmacloud-network.nix
create mode 100644 plasmavmc/crates/plasmavmc-server/src/rest.rs
create mode 100644 plasmavmc/crates/plasmavmc-server/src/watcher.rs
create mode 100644 prismnet/crates/prismnet-server/src/rest.rs
create mode 100644 prismnet/crates/prismnet-server/src/services/ipam.rs
create mode 100644 prismnet/crates/prismnet-types/src/service_ip_pool.rs
diff --git a/.TOAGENT.md.kate-swp b/.TOAGENT.md.kate-swp
deleted file mode 100644
index 9d6eff8727b66892c0742c649614e7fc90f2faf1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5783
zcmbtYU2hdt6uq@lL{X%IqDZ+=5UI8(@(l%1i=c1T#78CC2NR9NV0^Ua)^GesKp)g-
zNHlykYA`Y3fk}UZzu_POU*^eo_nLd=p1t;*JNFiwOwu*8*4q2*GkeZCx6x<}zj*xQ
zOmq7E<0qO&-h6AOxqae^Mx(Ln@{P$4UVCqL<>>tIKTBUf{qpF)e{G#UCQojcYlmEe
z`PEOSre9Kbc1{stNC^4W&zQ5T3#WA6DSiVdBWV}#I}z^&el_Afz$YT!3p^9?K7;oI
zzZ;()0G^0=68P5ib
z1ALpogTP@pc#g>#INXk1;w90(c>GMnh(53_;v%HjVOH@!uBGO2n4IDfH9lF9ih4ghyn#sL%r@8)X>
zLqhN_%y4Nt%qGj)oIE?tR`(@ozV$^dZF$>GXcfa%Y#5oob&5R=b4ABfn0XdjwH(fB
zwk5K6f3UM54{K*3=h-*Rzn{%5-@9LG`Kyh;@bm0DmOQ{A5)$7sLpG8%)hHtI?qd$L
zh6AnbrpmKVSomO{LhsDGVT2>yB8t$v76*NZgKntTR$jKXi<0}+=N#S0H`PZMd7hnN
zhle?V-VWaVSnIH*XAa^}ne=s>##o;won@iyvXNW!>8u`Ie8&6CM|>(3Ue75l!pb|-
zgT{(V{rAF0H_o~CD=HJ+F0$lPF)^j?-vk>5)Mp*O`F>V40`92FM?xtXfuys0feG%Y
z;Q-R^rQ|eY^@vkCuNR?S@S4DC!P{W)MqstzjRLFnd6QsX&~RsS%%UK8_gid&u7onj
z&23M$df?6@(X$|US5J^dQdSki*}^8^c=vV84bFxm3n@5x_9fFEWvf8*Ej7<@Gc;Kq
z;U+ZN1%SDg4I`7Pmte};7(9hZ3n|EBY)fSCe&<11^7S9Cw6hiG#goek9g{TVB~b;$
zoyTHg1;M+8m`s8oleIua1Ltuz0mrx0H#@i^TqvW!dqx)a
zRWEKc7^fcHi%$ZpUfeF2dl7e@io+@h^fo03QbKu&)D9J#9c%&)6(+%v`hi0&2wFIU
z;e!PjXz~ijGAC&LL>%ljG%1eS2qH?gI2Sk#Ly$Bs(9RnsrZ_SpaA?g=j7a)B(DF=e
z>A(y}(6U6*vVrN{pWcP@YWZ|GPmSzliA-B4nD43Q)2=7khVg6oF(fhe$}g
zJIi%8650FOC?cu6mistRT2*-~j7oOQiCChlgxk;Ix(X|;VT7_{PDf1j%K;8rr>!)R
z(W->!zV)q(es12+&B{oxUHO%#!z5fUEWc;?+o91FHQB}fCak#ER
zYDVN~gu0<9V$qChy@2)z2bJS%r;)AJyPs*ff&BSJ$-O(rwK8%!eAY!5IW1L4;3y{`
zhne0EbV7s4v0E^qV{pPmPO!Z*u_s~pyuiuCnp{7B>gMd(;vjlS=AvDVl!K{Be-8fv
Dez78l
diff --git a/.gitignore b/.gitignore
index 3a1852c..11fe864 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,9 @@ target/
result
result-*
+# local CI artifacts
+work/
+
# Python
.venv/
__pycache__/
diff --git a/Nix-NOS.md b/Nix-NOS.md
new file mode 100644
index 0000000..fa95be5
--- /dev/null
+++ b/Nix-NOS.md
@@ -0,0 +1,398 @@
+# PlasmaCloud/PhotonCloud ãš Nix-NOS ã®çµ±ååæ
+
+## Architecture Decision (2025-12-13)
+
+**決å®:** Nix-NOSãæ±çšãããã¯ãŒã¯ã¢ãžã¥ãŒã«ãšããŠå¥ãªããžããªã«åé¢ããã
+
+### Three-Layer Architecture
+
+```
+Layer 3: PlasmaCloud Cluster (T061)
+ - plasmacloud-cluster.nix
+ - cluster-config.jsonçæ
+ - Deployer (Rust)
+ depends on â
+
+Layer 2: PlasmaCloud Network (T061)
+ - plasmacloud-network.nix
+ - FiberLB BGP飿º
+ - PrismNETçµ±å
+ depends on â
+
+Layer 1: Nix-NOS Generic (T062) â å¥ãªããžããª
+ - BGP (BIRD2/GoBGP)
+ - VLAN
+ - Network interfaces
+ - PlasmaCloudãç¥ããªãæ±çšã¢ãžã¥ãŒã«
+```
+
+### Repository Structure
+
+- **github.com/centra/nix-nos**: Layer 1 (æ±çšãVyOS/OpenWrt代æ¿)
+- **github.com/centra/plasmacloud**: Layers 2+3 (æ¢åãªããžããª)
+
+---
+
+## 1. æ¢åãããžã§ã¯ãã®æŠèŠ
+
+PlasmaCloudïŒPhotonCloudïŒã¯ã以äžã®ã³ã³ããŒãã³ãã§æ§æãããã¯ã©ãŠãåºç€ãããžã§ã¯ãïŒ
+
+### ã³ã¢ãµãŒãã¹
+| ã³ã³ããŒãã³ã | åœ¹å² | æè¡ã¹ã¿ã㯠|
+|---------------|------|-------------|
+| **ChainFire** | 忣KVã¹ãã¢ïŒetcdäºæïŒ | Rust, Raft (openraft) |
+| **FlareDB** | SQLããŒã¿ããŒã¹ | Rust, KVããã¯ãšã³ã |
+| **IAM** | èªèšŒã»èªå¯ | Rust, JWT/mTLS |
+| **PlasmaVMC** | VM管ç | Rust, KVM/FireCracker |
+| **PrismNET** | ãªãŒããŒã¬ã€ãããã¯ãŒã¯ | Rust, OVN飿º |
+| **LightningSTOR** | ãªããžã§ã¯ãã¹ãã¬ãŒãž | Rust, S3äºæ |
+| **FlashDNS** | DNS | Rust, hickory-dns |
+| **FiberLB** | ããŒããã©ã³ãµãŒ | Rust, L4/L7, BGPäºå® |
+| **NightLight** | ã¡ããªã¯ã¹ | Rust, Prometheusäºæ |
+| **k8shost** | ã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ | Rust, K8s APIäºæ |
+
+### ã€ã³ãã©å±€
+- **NixOSã¢ãžã¥ãŒã«**: åãµãŒãã¹çš (`nix/modules/`)
+- **first-boot-automation**: èªåã¯ã©ã¹ã¿åå
+- **PXE/Netboot**: ãã¢ã¡ã¿ã«ããããžã§ãã³ã°
+- **TLSèšŒææžç®¡ç**: éçºçšèšŒææžçæã¹ã¯ãªãã
+
+---
+
+## 2. Nix-NOS ãšã®çµ±åãã€ã³ã
+
+### 2.1 Baremetal Provisioning â Deployer匷å
+
+**æ¢åã®å®è£
:**
+```
+first-boot-automation.nix
+âââ cluster-config.json ã«ããèšå®æ³šå
¥
+âââ bootstrap vs join ã®èªåå€å®
+âââ ããŒã«ãŒãã¡ã€ã«ã«ããåªçæ§
+âââ systemd ãµãŒãã¹é£æº
+```
+
+**Nix-NOSã§è¿œå ãã¹ãæ©èœ:**
+
+| æ¢å | Nix-NOS远å |
+|------|-------------|
+| cluster-config.json (æåäœæ) | topology.nix ããèªåçæ |
+| åäžã¯ã©ã¹ã¿æ§æ | è€æ°ã¯ã©ã¹ã¿/ãµã€ãå¯Ÿå¿ |
+| nixos-anywhere äŸå | Deployer (Phone Home + Push) |
+| åºå®IPèšå® | IPAM飿ºã«ããåçå²åœ |
+
+**çµ±åèšèš:**
+
+```nix
+# topology.nixïŒNix-NOSïŒ
+{
+ nix-nos.clusters.plasmacloud = {
+ nodes = {
+ "node01" = {
+ role = "control-plane";
+ ip = "10.0.1.10";
+ services = [ "chainfire" "flaredb" "iam" ];
+ };
+ "node02" = { role = "control-plane"; ip = "10.0.1.11"; };
+ "node03" = { role = "worker"; ip = "10.0.1.12"; };
+ };
+
+ # Nix-NOSãèªåçæ â first-boot-automationãèªã
+ # cluster-config.json ã®å
容ãNixè©äŸ¡æã«æ±ºå®
+ };
+}
+```
+
+### 2.2 Network Management â PrismNET + FiberLB + Nix-NOS BGP
+
+**æ¢åã®å®è£
:**
+```
+PrismNET (prismnet/)
+âââ VPC/Subnet/Port管ç
+âââ Security Groups
+âââ IPAM
+âââ OVN飿º
+
+FiberLB (fiberlb/)
+âââ L4/L7ããŒããã©ã³ã·ã³ã°
+âââ ãã«ã¹ãã§ãã¯
+âââ VIP管ç
+âââ BGPçµ±åïŒèšèšæžã¿ãGoBGPãµã€ãã«ãŒïŒ
+```
+
+**Nix-NOSã§è¿œå ãã¹ãæ©èœ:**
+
+```
+Nix-NOS Network Layer
+âââ BGPèšå®çæïŒBIRD2ïŒ
+â âââ iBGP/eBGPèªåèšç®
+â âââ Route Reflector察å¿
+â âââ ããªã·ãŒæœè±¡å
+âââ topology.nix â systemd-networkd
+âââ OpenWrt/Ciscoèšå®çæïŒå°æ¥ïŒ
+âââ FiberLB BGP飿º
+```
+
+**çµ±åèšèš:**
+
+```nix
+# Nix-NOSã®BGPã¢ãžã¥ãŒã« â FiberLBã®GoBGPèšå®ã«çµ±å
+{
+ nix-nos.network.bgp = {
+ autonomousSystems = {
+ "65000" = {
+ members = [ "node01" "node02" "node03" ];
+ ibgp.strategy = "route-reflector";
+ ibgp.reflectors = [ "node01" ];
+ };
+ };
+
+ # FiberLBã®VIPãBGPã§åºå ±
+ vipAdvertisements = {
+ "fiberlb" = {
+ vips = [ "10.0.100.1" "10.0.100.2" ];
+ nextHop = "self";
+ communities = [ "65000:100" ];
+ };
+ };
+ };
+
+ # FiberLBã¢ãžã¥ãŒã«ãšã®é£æº
+ services.fiberlb.bgp = {
+ enable = true;
+ # Nix-NOSãçæããGoBGPèšå®ãåç
§
+ configFile = config.nix-nos.network.bgp.gobgpConfig;
+ };
+}
+```
+
+### 2.3 K8sããã¢ã³ â k8shost + Pure NixOS Alternative
+
+**æ¢åã®å®è£
:**
+```
+k8shost (k8shost/)
+âââ Pod管çïŒgRPC APIïŒ
+âââ Service管çïŒClusterIP/NodePortïŒ
+âââ Node管ç
+âââ CNI飿º
+âââ CSI飿º
+âââ FiberLB/FlashDNS飿º
+```
+
+**Nix-NOSã®åœ¹å²:**
+
+k8shostã¯ãã§ã«Kubernetesã®ããã¢ã³ãšããŠæ©èœããŠãããNix-NOSã¯ïŒ
+
+1. **k8shostã䜿ãå Žå**: k8shostã¯ã©ã¹ã¿èªäœã®ãããã€ãNix-NOSã§ç®¡ç
+2. **Pure NixOSïŒK8sãªãïŒ**: ãã軜éãªéžæè¢ãšããŠãSystemd + Nix-NOSã§ãµãŒãã¹ç®¡ç
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â Orchestration Options â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
+â Option A: k8shost (K8s-like) â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â Nix-NOS manages: cluster topology, network, certs â â
+â â k8shost manages: pods, services, scaling â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+â Option B: Pure NixOS (K8s-free) â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â Nix-NOS manages: everything â â
+â â systemd + containers, static service discovery â â
+â â Use case: ã¯ã©ãŠãåºç€èªäœã®ç®¡ç â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
+
+**éèŠãªæŽå¯:**
+
+> ãã¯ã©ãŠãã®åºç€ãã®ãã®ãäœãã®ã«Kubernetesã¯äœ¿ããããªãã
+
+ããã¯æ£ããã¢ãããŒããPlasmaCloudã®ã³ã¢ãµãŒãã¹ïŒChainFire, FlareDB, IAMçïŒã¯ïŒ
+- K8sã®äžã§åãã®ã§ã¯ãªããK8sãæäŸããåŽ
+- Pure NixOS + Systemdã§ç®¡çãããã¹ã
+- Nix-NOSã¯ãã®ã¬ã€ã€ãŒãæ
åœ
+
+---
+
+## 3. å
·äœçãªçµ±åèšç»
+
+### Phase 1: Baremetal Provisioningçµ±å
+
+**ç®æš:** first-boot-automationãNix-NOSã®topology.nixãšé£æº
+
+```nix
+# nix/modules/first-boot-automation.nix ãžã®è¿œå
+{ config, lib, ... }:
+let
+ # Nix-NOSã®ããããžãŒããèšå®ãçæ
+ clusterConfig =
+ if config.nix-nos.cluster != null then
+ config.nix-nos.cluster.generateClusterConfig {
+ hostname = config.networking.hostName;
+ }
+ else
+ # åŸæ¥ã®cluster-config.jsonèªã¿èŸŒã¿
+ builtins.fromJSON (builtins.readFile /etc/nixos/secrets/cluster-config.json);
+in {
+ # æ¢åã®first-boot-automationããžãã¯ã¯ãã®ãŸãŸ
+ # ãã ãèšå®ãœãŒã¹ãNix-NOSã«åãæ¿ãå¯èœã«
+}
+```
+
+### Phase 2: BGP/Networkçµ±å
+
+**ç®æš:** FiberLBã®BGP飿ºïŒT055.S3ïŒãNix-NOSã§å®£èšçã«ç®¡ç
+
+```nix
+# nix/modules/fiberlb-bgp-nixnos.nix
+{ config, lib, pkgs, ... }:
+let
+ fiberlbCfg = config.services.fiberlb;
+ nixnosBgp = config.nix-nos.network.bgp;
+in {
+ config = lib.mkIf (fiberlbCfg.enable && nixnosBgp.enable) {
+ # GoBGPèšå®ãNix-NOSããçæ
+ services.gobgpd = {
+ enable = true;
+ configFile = pkgs.writeText "gobgp.yaml" (
+ nixnosBgp.generateGobgpConfig {
+ localAs = nixnosBgp.getLocalAs config.networking.hostName;
+ routerId = nixnosBgp.getRouterId config.networking.hostName;
+ neighbors = nixnosBgp.getPeers config.networking.hostName;
+ }
+ );
+ };
+
+ # FiberLBã«GoBGPã¢ãã¬ã¹ã泚å
¥
+ services.fiberlb.bgp = {
+ gobgpAddress = "127.0.0.1:50051";
+ };
+ };
+}
+```
+
+### Phase 3: Deployerå®è£
+
+**ç®æš:** Phone Home + Pushåãããã€ã¡ã³ãã³ã³ãããŒã©ãŒ
+
+```
+plasmacloud/
+âââ deployer/ # æ°èŠè¿œå
+â âââ src/
+â â âââ api.rs # Phone Home API
+â â âââ orchestrator.rs # ãããã€ã¯ãŒã¯ãããŒ
+â â âââ state.rs # ããŒãç¶æ
管çïŒChainFire飿ºïŒ
+â â âââ iso_generator.rs # ISOèªåçæ
+â âââ Cargo.toml
+âââ nix/
+ âââ modules/
+ âââ deployer.nix # NixOSã¢ãžã¥ãŒã«
+```
+
+**ChainFireãšã®é£æº:**
+
+Deployerã¯ChainFireãç¶æ
ã¹ãã¢ãšããŠäœ¿çšïŒ
+
+```rust
+// deployer/src/state.rs
+struct NodeState {
+ hostname: String,
+ status: NodeStatus, // Pending, Provisioning, Active, Failed
+ bootstrap_key_hash: Option,
+ ssh_pubkey: Option,
+ last_seen: DateTime,
+}
+
+impl DeployerState {
+ async fn register_node(&self, node: &NodeState) -> Result<()> {
+ // ChainFireã«ä¿å
+ self.chainfire_client
+ .put(format!("deployer/nodes/{}", node.hostname), node.to_json())
+ .await
+ }
+}
+```
+
+---
+
+## 4. ã¢ãŒããã¯ãã£å
šäœå³
+
+```
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â Nix-NOS Layer â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â topology.nix â â
+â â - ããŒãå®çŸ© â â
+â â - ãããã¯ãŒã¯ããããžãŒ â â
+â â - ãµãŒãã¹é
眮 â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â â
+â generates â â
+â ⌠â
+â ââââââââââââââââ¬âââââââââââââââ¬âââââââââââââââ¬âââââââââââââââ â
+â â NixOS Config â BIRD Config â GoBGP Config â cluster- â â
+â â (systemd) â (BGP) â (FiberLB) â config.json â â
+â ââââââââââââââââŽâââââââââââââââŽâââââââââââââââŽâââââââââââââââ â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+ â
+ âŒ
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+â PlasmaCloud Services â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â Control Plane â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â
+â â âChainFire â â FlareDB â â IAM â â Deployer â â â
+â â â(Raft KV) â â (SQL) â â(AuthN/Z) â â (æ°èŠ) â â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â Network Plane â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â
+â â â PrismNET â â FiberLB â â FlashDNS â â BIRD2 â â â
+â â â (OVN) â â(LB+BGP) â â (DNS) â â(Nix-NOS) â â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ ââââââââââââ â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+â â Compute Plane â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ â â
+â â âPlasmaVMC â â k8shost â âLightning â â â
+â â â(VM/FC) â â(K8s-like)â â STOR â â â
+â â ââââââââââââ ââââââââââââ ââââââââââââ â â
+â âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
+âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
+```
+
+---
+
+## 5. åªå
床ãšå®è£
é åº
+
+| åªå
床 | æ©èœ | äŸåé¢ä¿ | å·¥æ° |
+|--------|------|----------|------|
+| **P0** | topology.nix â cluster-config.jsonçæ | ãªã | 1é±é |
+| **P0** | BGPã¢ãžã¥ãŒã«ïŒBIRD2èšå®çæïŒ | ãªã | 2é±é |
+| **P1** | FiberLB BGP飿ºïŒGoBGPïŒ | T055.S3å®äº | 2é±é |
+| **P1** | Deployeråºæ¬å®è£
| ChainFire | 3é±é |
+| **P2** | OpenWrtèšå®çæ | BGPã¢ãžã¥ãŒã« | 2é±é |
+| **P2** | ISOèªåçæãã€ãã©ã€ã³ | Deployerå®äºåŸ | 1é±é |
+| **P2** | åãµãŒãã¹ã®èšå®ãNixã§ç®¡çå¯èœãªããã« | ãªã | é©åœ |
+
+---
+
+## 6. çµè«
+
+PlasmaCloud/PhotonCloudãããžã§ã¯ãã¯ãNix-NOSã®æ§æ³ãå®è£
ããããã®**çæ³çãªåºç€**ïŒ
+
+1. **ãã§ã«NixOSã¢ãžã¥ãŒã«åãããŠãã** â Nix-NOSã¢ãžã¥ãŒã«ãšã®çµ±åã容æ
+2. **first-boot-automationãååš** â Deployerã®åºç€ãšããŠæŽ»çšå¯èœ
+3. **FiberLBã«BGPèšèšããã** â Nix-NOSã®BGPã¢ãžã¥ãŒã«ãšèªç¶ã«çµ±å
+4. **ChainFireãç¶æ
ã¹ãã¢** â Deployerç¶æ
管çã«å©çšå¯èœ
+5. **k8shostãååšãããK8sã§ã¯ãªã** â ãK8sããã¢ã³ãã®å²åŠãšäžèŽ
+
+**次ã®ã¢ã¯ã·ã§ã³:**
+1. Nix-NOSã¢ãžã¥ãŒã«ãPlasmaCloudãªããžããªã«è¿œå
+2. topology.nix â cluster-config.jsonçæã®å®è£
+3. BGPã¢ãžã¥ãŒã«ïŒBIRD2ïŒã®å®è£
ãšFiberLB飿º
diff --git a/PROJECT.md b/PROJECT.md
index 4ab83e0..48233de 100644
--- a/PROJECT.md
+++ b/PROJECT.md
@@ -43,7 +43,11 @@ Peer AãžïŒ**èªåã§æŠç¥ã**決ããŠè¯ãïŒå¥œãã«ããïŒ
- k0sãšãk3sãšããåèã«ãªãããç¥ããªãã
9. ããããNixOSäžã§åãããã«ããã±ãŒãžåãããããããšè¯ãïŒFlakeåïŒïŒã
- ããšãNixã§èšå®ã§ãããšè¯ãããŸãèšå®ãã¡ã€ã«ãçæããã ããªã®ã§ããã¯ã§ãããšæãã
-10. Nixã«ãããã¢ã¡ã¿ã«ããããžã§ãã³ã°
+10. Nixã«ãããã¢ã¡ã¿ã«ããããžã§ãã³ã°ïŒDeployerïŒ
+ - Phone Home + Pushåã®ãããã€ã¡ã³ãã³ã³ãããŒã©ãŒ
+ - topology.nix ããã¯ã©ã¹ã¿èšå®ãèªåçæ
+ - ChainFireãç¶æ
ã¹ãã¢ãšããŠäœ¿çš
+ - ISOèªåçæãã€ãã©ã€ã³å¯Ÿå¿
11. ãªãŒããŒã¬ã€ãããã¯ãŒã¯
- ãã«ãããã³ãã§ãããŸãåãããã«ã¯ããŠãŒã¶ãŒã®äžã§ã¢ã¯ã»ã¹ã§ãããããã¯ãŒã¯ãªã©ãèããªããã°ãããªãããšãå±±ã»ã©ããããããåŠç ãããã®ãå¿
èŠã
- ãšãããããããã¯ãŒã¯éšåèªäœã®å®è£
ã¯OVNãšãã§è¯ãã
diff --git a/TOAGENT.md b/TOAGENT.md
index b1e83d7..05cf3a1 100644
--- a/TOAGENT.md
+++ b/TOAGENT.md
@@ -2,4 +2,4 @@ Peer AãžïŒ
/a ããªãã¯peerAã§ããæŠç¥æ±ºå®ãšèšç»ç«æ¡ã«ç¹åããŠãã ãããå®éã®äœæ¥ã¯ãpeerBãžäŸé ŒããŠãã ãããPROJECT.mdã¯åºŠã
æŽæ°ãããããšãããã®ã§ãPORã«å
容ã远å ããããé©åã«MVPãèšå®ã»å°éç¶æ³ã確èªãããªã©ãããªãã®ä»äºã§ãããšããããçµããåã«ç¢ºå®ã«ã¿ã¹ã¯ãpeerBã«æž¡ãããšãèããŠãã ããã
Peer BãžïŒ
-/b peerAããã®å®è£
äŸé Œã«åºã¥ããŠå®è£
ãå®éšãªã©ã®äœæ¥ãè¡ããçµãã£ãããšã¯å¿
ãpeerAã«çµæãå ±åããŠãã ãããé«å質ã«äœæ¥ãè¡ãããšã«éäžããŠãã ããã
+/b peerAããã®å®è£
äŸé Œã«åºã¥ããŠå®è£
ãå®éšãªã©ã®äœæ¥ãè¡ããçµãã£ãããšã¯å¿
ãpeerAã«çµæãïŒto_peer.mdã§ïŒå ±åããŠãã ãããé«å質ã«äœæ¥ãè¡ãããšã«éäžããŠãã ããã
diff --git a/baremetal/vm-cluster/launch-node01-from-disk.sh b/baremetal/vm-cluster/launch-node01-from-disk.sh
new file mode 100755
index 0000000..e473f9b
--- /dev/null
+++ b/baremetal/vm-cluster/launch-node01-from-disk.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# PlasmaCloud VM Cluster - Node 01 (Boot from installed NixOS on disk)
+# Boots from the NixOS installation created by nixos-anywhere
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+DISK="${SCRIPT_DIR}/node01.qcow2"
+
+# Networking
+MAC_MCAST="52:54:00:12:34:01" # eth0: multicast VDE
+MAC_SLIRP="52:54:00:aa:bb:01" # eth1: SLIRP DHCP (10.0.2.15)
+SSH_PORT=2201 # Host port -> VM port 22
+
+# Console access
+VNC_DISPLAY=":1" # VNC fallback
+SERIAL_PORT=4401 # Telnet serial
+
+# Check if disk exists
+if [ ! -f "$DISK" ]; then
+ echo "ERROR: Disk not found at $DISK"
+ exit 1
+fi
+
+# Check if VDE switch is running
+if ! pgrep -f "vde_switch.*vde.sock" > /dev/null; then
+ echo "ERROR: VDE switch not running. Start with: vde_switch -sock /tmp/vde.sock -daemon"
+ exit 1
+fi
+
+echo "============================================"
+echo "Launching node01 from disk (installed NixOS)..."
+echo "============================================"
+echo " Disk: ${DISK}"
+echo ""
+echo "Network interfaces:"
+echo " eth0 (VDE): MAC ${MAC_MCAST}"
+echo " eth1 (SLIRP): MAC ${MAC_SLIRP}, SSH on host:${SSH_PORT}"
+echo ""
+echo "Console access:"
+echo " Serial: telnet localhost ${SERIAL_PORT}"
+echo " VNC: vncviewer localhost${VNC_DISPLAY} (port 5901)"
+echo " SSH: ssh -p ${SSH_PORT} root@localhost"
+echo ""
+echo "Boot: From disk (installed NixOS)"
+echo "============================================"
+
+cd "${SCRIPT_DIR}"
+
+qemu-system-x86_64 \
+ -name node01 \
+ -machine type=q35,accel=kvm \
+ -cpu host \
+ -smp 4 \
+ -m 4G \
+ -drive file="${DISK}",if=virtio,format=qcow2 \
+ -netdev vde,id=vde0,sock=/tmp/vde.sock \
+ -device virtio-net-pci,netdev=vde0,mac="${MAC_MCAST}" \
+ -netdev user,id=user0,hostfwd=tcp::${SSH_PORT}-:22 \
+ -device virtio-net-pci,netdev=user0,mac="${MAC_SLIRP}" \
+ -vnc "${VNC_DISPLAY}" \
+ -serial mon:telnet:127.0.0.1:${SERIAL_PORT},server,nowait \
+ -daemonize
+
+echo "Node01 started successfully!"
+echo "Wait 10-15 seconds for boot, then: ssh -p ${SSH_PORT} root@localhost"
diff --git a/baremetal/vm-cluster/launch-node02-from-disk.sh b/baremetal/vm-cluster/launch-node02-from-disk.sh
new file mode 100755
index 0000000..d848380
--- /dev/null
+++ b/baremetal/vm-cluster/launch-node02-from-disk.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# PlasmaCloud VM Cluster - Node 02 (Boot from installed NixOS on disk)
+# Boots from the NixOS installation created by nixos-anywhere
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+DISK="${SCRIPT_DIR}/node02.qcow2"
+
+# Networking
+MAC_MCAST="52:54:00:12:34:02" # eth0: multicast VDE
+MAC_SLIRP="52:54:00:aa:bb:02" # eth1: SLIRP DHCP (10.0.2.15)
+SSH_PORT=2202 # Host port -> VM port 22
+
+# Console access
+VNC_DISPLAY=":2" # VNC fallback
+SERIAL_PORT=4402 # Telnet serial
+
+# Check if disk exists
+if [ ! -f "$DISK" ]; then
+ echo "ERROR: Disk not found at $DISK"
+ exit 1
+fi
+
+# Check if VDE switch is running
+if ! pgrep -f "vde_switch.*vde.sock" > /dev/null; then
+ echo "ERROR: VDE switch not running. Start with: vde_switch -sock /tmp/vde.sock -daemon"
+ exit 1
+fi
+
+echo "============================================"
+echo "Launching node02 from disk (installed NixOS)..."
+echo "============================================"
+echo " Disk: ${DISK}"
+echo ""
+echo "Network interfaces:"
+echo " eth0 (VDE): MAC ${MAC_MCAST}"
+echo " eth1 (SLIRP): MAC ${MAC_SLIRP}, SSH on host:${SSH_PORT}"
+echo ""
+echo "Console access:"
+echo " Serial: telnet localhost ${SERIAL_PORT}"
+echo " VNC: vncviewer localhost${VNC_DISPLAY} (port 5902)"
+echo " SSH: ssh -p ${SSH_PORT} root@localhost"
+echo ""
+echo "Boot: From disk (installed NixOS)"
+echo "============================================"
+
+cd "${SCRIPT_DIR}"
+
+qemu-system-x86_64 \
+ -name node02 \
+ -machine type=q35,accel=kvm \
+ -cpu host \
+ -smp 4 \
+ -m 4G \
+ -drive file="${DISK}",if=virtio,format=qcow2 \
+ -netdev vde,id=vde0,sock=/tmp/vde.sock \
+ -device virtio-net-pci,netdev=vde0,mac="${MAC_MCAST}" \
+ -netdev user,id=user0,hostfwd=tcp::${SSH_PORT}-:22 \
+ -device virtio-net-pci,netdev=user0,mac="${MAC_SLIRP}" \
+ -vnc "${VNC_DISPLAY}" \
+ -serial mon:telnet:127.0.0.1:${SERIAL_PORT},server,nowait \
+ -daemonize
+
+echo "Node02 started successfully!"
+echo "Wait 10-15 seconds for boot, then: ssh -p ${SSH_PORT} root@localhost"
diff --git a/baremetal/vm-cluster/launch-node03-from-disk.sh b/baremetal/vm-cluster/launch-node03-from-disk.sh
new file mode 100755
index 0000000..c3c0a47
--- /dev/null
+++ b/baremetal/vm-cluster/launch-node03-from-disk.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# PlasmaCloud VM Cluster - Node 03 (Boot from installed NixOS on disk)
+# Boots from the NixOS installation created by nixos-anywhere
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+DISK="${SCRIPT_DIR}/node03.qcow2"
+
+# Networking
+MAC_MCAST="52:54:00:12:34:03" # eth0: multicast VDE
+MAC_SLIRP="52:54:00:aa:bb:03" # eth1: SLIRP DHCP (10.0.2.15)
+SSH_PORT=2203 # Host port -> VM port 22
+
+# Console access
+VNC_DISPLAY=":3" # VNC fallback
+SERIAL_PORT=4403 # Telnet serial
+
+# Check if disk exists
+if [ ! -f "$DISK" ]; then
+ echo "ERROR: Disk not found at $DISK"
+ exit 1
+fi
+
+# Check if VDE switch is running
+if ! pgrep -f "vde_switch.*vde.sock" > /dev/null; then
+ echo "ERROR: VDE switch not running. Start with: vde_switch -sock /tmp/vde.sock -daemon"
+ exit 1
+fi
+
+echo "============================================"
+echo "Launching node03 from disk (installed NixOS)..."
+echo "============================================"
+echo " Disk: ${DISK}"
+echo ""
+echo "Network interfaces:"
+echo " eth0 (VDE): MAC ${MAC_MCAST}"
+echo " eth1 (SLIRP): MAC ${MAC_SLIRP}, SSH on host:${SSH_PORT}"
+echo ""
+echo "Console access:"
+echo " Serial: telnet localhost ${SERIAL_PORT}"
+echo " VNC: vncviewer localhost${VNC_DISPLAY} (port 5903)"
+echo " SSH: ssh -p ${SSH_PORT} root@localhost"
+echo ""
+echo "Boot: From disk (installed NixOS)"
+echo "============================================"
+
+cd "${SCRIPT_DIR}"
+
+qemu-system-x86_64 \
+ -name node03 \
+ -machine type=q35,accel=kvm \
+ -cpu host \
+ -smp 4 \
+ -m 4G \
+ -drive file="${DISK}",if=virtio,format=qcow2 \
+ -netdev vde,id=vde0,sock=/tmp/vde.sock \
+ -device virtio-net-pci,netdev=vde0,mac="${MAC_MCAST}" \
+ -netdev user,id=user0,hostfwd=tcp::${SSH_PORT}-:22 \
+ -device virtio-net-pci,netdev=user0,mac="${MAC_SLIRP}" \
+ -vnc "${VNC_DISPLAY}" \
+ -serial mon:telnet:127.0.0.1:${SERIAL_PORT},server,nowait \
+ -daemonize
+
+echo "Node03 started successfully!"
+echo "Wait 10-15 seconds for boot, then: ssh -p ${SSH_PORT} root@localhost"
diff --git a/chainfire/Cargo.lock b/chainfire/Cargo.lock
index f7ea58b..3f4be67 100644
--- a/chainfire/Cargo.lock
+++ b/chainfire/Cargo.lock
@@ -99,27 +99,12 @@ dependencies = [
"windows-sys 0.61.2",
]
-[[package]]
-name = "anyerror"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71add24cc141a1e8326f249b74c41cfd217aeb2a67c9c6cf9134d175469afd49"
-dependencies = [
- "serde",
-]
-
[[package]]
name = "anyhow"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
-[[package]]
-name = "arrayvec"
-version = "0.7.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
-
[[package]]
name = "async-stream"
version = "0.3.6"
@@ -139,7 +124,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -150,7 +135,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -278,7 +263,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -293,18 +278,6 @@ version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
-[[package]]
-name = "bitvec"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
-dependencies = [
- "funty",
- "radium",
- "tap",
- "wyz",
-]
-
[[package]]
name = "block-buffer"
version = "0.10.4"
@@ -314,69 +287,12 @@ dependencies = [
"generic-array",
]
-[[package]]
-name = "borsh"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f"
-dependencies = [
- "borsh-derive",
- "cfg_aliases",
-]
-
-[[package]]
-name = "borsh-derive"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c"
-dependencies = [
- "once_cell",
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 2.0.111",
-]
-
[[package]]
name = "bumpalo"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
-[[package]]
-name = "byte-unit"
-version = "5.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d"
-dependencies = [
- "rust_decimal",
- "schemars",
- "serde",
- "utf8-width",
-]
-
-[[package]]
-name = "bytecheck"
-version = "0.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
-dependencies = [
- "bytecheck_derive",
- "ptr_meta",
- "simdutf8",
-]
-
-[[package]]
-name = "bytecheck_derive"
-version = "0.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "bytes"
version = "1.11.0"
@@ -426,12 +342,6 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
-[[package]]
-name = "cfg_aliases"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
-
[[package]]
name = "chainfire-api"
version = "0.1.0"
@@ -443,7 +353,6 @@ dependencies = [
"chainfire-types",
"chainfire-watch",
"futures",
- "openraft",
"prost",
"prost-types",
"tokio",
@@ -475,6 +384,7 @@ version = "0.1.0"
dependencies = [
"async-trait",
"bytes",
+ "chainfire-gossip",
"chainfire-types",
"dashmap",
"futures",
@@ -529,7 +439,6 @@ dependencies = [
"chainfire-types",
"dashmap",
"futures",
- "openraft",
"parking_lot",
"rand 0.8.5",
"serde",
@@ -553,6 +462,7 @@ dependencies = [
"chainfire-storage",
"chainfire-types",
"chainfire-watch",
+ "chrono",
"clap",
"config",
"criterion",
@@ -562,6 +472,7 @@ dependencies = [
"metrics",
"metrics-exporter-prometheus",
"serde",
+ "serde_json",
"tempfile",
"tokio",
"toml 0.8.23",
@@ -571,6 +482,7 @@ dependencies = [
"tower-http",
"tracing",
"tracing-subscriber",
+ "uuid",
]
[[package]]
@@ -623,6 +535,7 @@ dependencies = [
"iana-time-zone",
"js-sys",
"num-traits",
+ "serde",
"wasm-bindgen",
"windows-link",
]
@@ -695,7 +608,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -863,27 +776,6 @@ dependencies = [
"parking_lot_core",
]
-[[package]]
-name = "derive_more"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05"
-dependencies = [
- "derive_more-impl",
-]
-
-[[package]]
-name = "derive_more-impl"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.111",
- "unicode-xid",
-]
-
[[package]]
name = "digest"
version = "0.10.7"
@@ -906,12 +798,6 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
-[[package]]
-name = "dyn-clone"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
-
[[package]]
name = "either"
version = "1.15.0"
@@ -986,12 +872,6 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
-[[package]]
-name = "funty"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
-
[[package]]
name = "futures"
version = "0.3.31"
@@ -1048,7 +928,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -1512,12 +1392,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "maplit"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
-
[[package]]
name = "matchers"
version = "0.2.0"
@@ -1670,42 +1544,6 @@ version = "11.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
-[[package]]
-name = "openraft"
-version = "0.9.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc22bb6823c606299be05f3cc0d2ac30216412e05352eaf192a481c12ea055fc"
-dependencies = [
- "anyerror",
- "byte-unit",
- "chrono",
- "clap",
- "derive_more",
- "futures",
- "maplit",
- "openraft-macros",
- "rand 0.8.5",
- "serde",
- "thiserror 1.0.69",
- "tokio",
- "tracing",
- "tracing-futures",
- "validit",
-]
-
-[[package]]
-name = "openraft-macros"
-version = "0.9.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8e5c7db6c8f2137b45a63096e09ac5a89177799b4bb0073915a5f41ee156651"
-dependencies = [
- "chrono",
- "proc-macro2",
- "quote",
- "semver",
- "syn 2.0.111",
-]
-
[[package]]
name = "openssl-probe"
version = "0.1.6"
@@ -1787,7 +1625,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -1827,7 +1665,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -1908,16 +1746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
- "syn 2.0.111",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983"
-dependencies = [
- "toml_edit 0.23.9",
+ "syn",
]
[[package]]
@@ -1955,7 +1784,7 @@ dependencies = [
"prost",
"prost-types",
"regex",
- "syn 2.0.111",
+ "syn",
"tempfile",
]
@@ -1969,7 +1798,7 @@ dependencies = [
"itertools 0.14.0",
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -2045,26 +1874,6 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95067976aca6421a523e491fce939a3e65249bac4b977adee0ee9771568e8aa3"
-[[package]]
-name = "ptr_meta"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
-dependencies = [
- "ptr_meta_derive",
-]
-
-[[package]]
-name = "ptr_meta_derive"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "quanta"
version = "0.12.6"
@@ -2095,12 +1904,6 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
-[[package]]
-name = "radium"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
-
[[package]]
name = "rand"
version = "0.8.5"
@@ -2198,26 +2001,6 @@ dependencies = [
"bitflags 2.10.0",
]
-[[package]]
-name = "ref-cast"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.25"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.111",
-]
-
[[package]]
name = "regex"
version = "1.12.2"
@@ -2247,15 +2030,6 @@ version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
-[[package]]
-name = "rend"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
-dependencies = [
- "bytecheck",
-]
-
[[package]]
name = "ring"
version = "0.17.14"
@@ -2270,35 +2044,6 @@ dependencies = [
"windows-sys 0.52.0",
]
-[[package]]
-name = "rkyv"
-version = "0.7.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b"
-dependencies = [
- "bitvec",
- "bytecheck",
- "bytes",
- "hashbrown 0.12.3",
- "ptr_meta",
- "rend",
- "rkyv_derive",
- "seahash",
- "tinyvec",
- "uuid",
-]
-
-[[package]]
-name = "rkyv_derive"
-version = "0.7.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
[[package]]
name = "rocksdb"
version = "0.24.0"
@@ -2330,22 +2075,6 @@ dependencies = [
"ordered-multimap",
]
-[[package]]
-name = "rust_decimal"
-version = "1.39.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35affe401787a9bd846712274d97654355d21b2a2c092a3139aabe31e9022282"
-dependencies = [
- "arrayvec",
- "borsh",
- "bytes",
- "num-traits",
- "rand 0.8.5",
- "rkyv",
- "serde",
- "serde_json",
-]
-
[[package]]
name = "rustc-hash"
version = "2.1.1"
@@ -2453,30 +2182,12 @@ dependencies = [
"windows-sys 0.61.2",
]
-[[package]]
-name = "schemars"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289"
-dependencies = [
- "dyn-clone",
- "ref-cast",
- "serde",
- "serde_json",
-]
-
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-[[package]]
-name = "seahash"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
-
[[package]]
name = "security-framework"
version = "3.5.1"
@@ -2500,12 +2211,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "semver"
-version = "1.0.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
-
[[package]]
name = "serde"
version = "1.0.228"
@@ -2533,7 +2238,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -2616,12 +2321,6 @@ dependencies = [
"libc",
]
-[[package]]
-name = "simdutf8"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
-
[[package]]
name = "sketches-ddsketch"
version = "0.2.2"
@@ -2672,17 +2371,6 @@ version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
[[package]]
name = "syn"
version = "2.0.111"
@@ -2700,12 +2388,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
-[[package]]
-name = "tap"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
-
[[package]]
name = "tempfile"
version = "3.23.0"
@@ -2745,7 +2427,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -2756,7 +2438,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -2778,21 +2460,6 @@ dependencies = [
"serde_json",
]
-[[package]]
-name = "tinyvec"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
[[package]]
name = "tokio"
version = "1.48.0"
@@ -2818,7 +2485,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -2872,8 +2539,8 @@ checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
"serde_spanned",
- "toml_datetime 0.6.11",
- "toml_edit 0.22.27",
+ "toml_datetime",
+ "toml_edit",
]
[[package]]
@@ -2885,15 +2552,6 @@ dependencies = [
"serde",
]
-[[package]]
-name = "toml_datetime"
-version = "0.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533"
-dependencies = [
- "serde_core",
-]
-
[[package]]
name = "toml_edit"
version = "0.22.27"
@@ -2903,32 +2561,11 @@ dependencies = [
"indexmap 2.12.1",
"serde",
"serde_spanned",
- "toml_datetime 0.6.11",
+ "toml_datetime",
"toml_write",
"winnow",
]
-[[package]]
-name = "toml_edit"
-version = "0.23.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832"
-dependencies = [
- "indexmap 2.12.1",
- "toml_datetime 0.7.3",
- "toml_parser",
- "winnow",
-]
-
-[[package]]
-name = "toml_parser"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e"
-dependencies = [
- "winnow",
-]
-
[[package]]
name = "toml_write"
version = "0.1.2"
@@ -2979,7 +2616,7 @@ dependencies = [
"prost-build",
"prost-types",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -3079,7 +2716,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -3092,16 +2729,6 @@ dependencies = [
"valuable",
]
-[[package]]
-name = "tracing-futures"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
-dependencies = [
- "pin-project",
- "tracing",
-]
-
[[package]]
name = "tracing-log"
version = "0.2.0"
@@ -3155,24 +2782,12 @@ version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
-[[package]]
-name = "unicode-xid"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
-
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
-[[package]]
-name = "utf8-width"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091"
-
[[package]]
name = "utf8parse"
version = "0.2.2"
@@ -3185,19 +2800,12 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
dependencies = [
+ "getrandom 0.3.4",
"js-sys",
+ "serde_core",
"wasm-bindgen",
]
-[[package]]
-name = "validit"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1fad49f3eae9c160c06b4d49700a99e75817f127cf856e494b56d5e23170020"
-dependencies = [
- "anyerror",
-]
-
[[package]]
name = "valuable"
version = "0.1.1"
@@ -3282,7 +2890,7 @@ dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
"wasm-bindgen-shared",
]
@@ -3357,7 +2965,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -3368,7 +2976,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
@@ -3566,15 +3174,6 @@ version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
-[[package]]
-name = "wyz"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
-dependencies = [
- "tap",
-]
-
[[package]]
name = "yaml-rust"
version = "0.4.5"
@@ -3601,7 +3200,7 @@ checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.111",
+ "syn",
]
[[package]]
diff --git a/chainfire/Cargo.toml b/chainfire/Cargo.toml
index 4bc289d..b943c9d 100644
--- a/chainfire/Cargo.toml
+++ b/chainfire/Cargo.toml
@@ -40,10 +40,6 @@ tokio-stream = "0.1"
futures = "0.3"
async-trait = "0.1"
-# Raft
-# loosen-follower-log-revert: permit follower log to revert without leader panic (needed for learner->voter conversion)
-openraft = { version = "0.9", features = ["serde", "storage-v2", "loosen-follower-log-revert"] }
-
# Gossip (SWIM protocol)
foca = { version = "1.0", features = ["std", "tracing", "serde", "postcard-codec"] }
diff --git a/chainfire/chainfire-client/src/client.rs b/chainfire/chainfire-client/src/client.rs
index 2781d4a..db59a5d 100644
--- a/chainfire/chainfire-client/src/client.rs
+++ b/chainfire/chainfire-client/src/client.rs
@@ -170,7 +170,7 @@ impl Client {
.into_inner();
let more = resp.more;
- let mut kvs: Vec<(Vec, Vec, u64)> = resp
+ let kvs: Vec<(Vec, Vec, u64)> = resp
.kvs
.into_iter()
.map(|kv| (kv.key, kv.value, kv.mod_revision as u64))
@@ -211,7 +211,7 @@ impl Client {
.into_inner();
let more = resp.more;
- let mut kvs: Vec<(Vec, Vec, u64)> = resp
+ let kvs: Vec<(Vec, Vec, u64)> = resp
.kvs
.into_iter()
.map(|kv| (kv.key, kv.value, kv.mod_revision as u64))
diff --git a/chainfire/chainfire-client/src/lib.rs b/chainfire/chainfire-client/src/lib.rs
index ea39197..d78af65 100644
--- a/chainfire/chainfire-client/src/lib.rs
+++ b/chainfire/chainfire-client/src/lib.rs
@@ -31,4 +31,4 @@ mod watch;
pub use client::{CasOutcome, Client};
pub use error::{ClientError, Result};
pub use node::{NodeCapacity, NodeFilter, NodeMetadata};
-pub use watch::WatchHandle;
+pub use watch::{EventType, WatchEvent, WatchHandle};
diff --git a/chainfire/chainfire-client/src/node.rs b/chainfire/chainfire-client/src/node.rs
index 6a2f7be..e361948 100644
--- a/chainfire/chainfire-client/src/node.rs
+++ b/chainfire/chainfire-client/src/node.rs
@@ -198,7 +198,7 @@ pub async fn get_node(client: &mut Client, node_id: u64) -> Result