cs-codex-dist-tests/ProjectPlugins/CodexPlugin/CodexSetup.cs

243 lines
7.5 KiB
C#
Raw Normal View History

2023-09-19 08:24:43 +00:00
using CodexContractsPlugin;
using GethPlugin;
using KubernetesWorkflow;
2023-09-08 08:21:40 +00:00
using Utils;
2023-04-12 14:06:04 +00:00
namespace CodexPlugin
2023-04-12 14:06:04 +00:00
{
2023-04-13 07:33:10 +00:00
public interface ICodexSetup
2023-04-12 14:06:04 +00:00
{
ICodexSetup WithName(string name);
2023-09-25 06:47:19 +00:00
ICodexSetup At(ILocation location);
2023-09-19 09:51:59 +00:00
ICodexSetup WithBootstrapNode(ICodexNode node);
ICodexSetup WithLogLevel(CodexLogLevel level);
ICodexSetup WithLogLevel(CodexLogLevel level, CodexLogCustomTopics customTopics);
2023-04-13 07:33:10 +00:00
ICodexSetup WithStorageQuota(ByteSize storageQuota);
ICodexSetup WithBlockTTL(TimeSpan duration);
ICodexSetup WithBlockMaintenanceInterval(TimeSpan duration);
ICodexSetup WithBlockMaintenanceNumber(int numberOfBlocks);
2023-09-13 09:59:21 +00:00
ICodexSetup EnableMetrics();
ICodexSetup EnableMarketplace(IGethNode gethNode, ICodexContracts codexContracts, Action<IMarketplaceSetup> marketplaceSetup);
2023-09-14 05:17:30 +00:00
/// <summary>
/// Provides an invalid proof every N proofs
/// </summary>
ICodexSetup WithSimulateProofFailures(uint failEveryNProofs);
ICodexSetup AsPublicTestNet(CodexTestNetConfig testNetConfig);
2023-04-12 14:06:04 +00:00
}
public interface IMarketplaceSetup
{
IMarketplaceSetup WithInitial(Ether eth, TestToken tokens);
IMarketplaceSetup WithAccount(EthAccount account);
IMarketplaceSetup AsStorageNode();
IMarketplaceSetup AsValidator();
}
public class CodexLogCustomTopics
{
2024-01-18 08:55:07 +00:00
public CodexLogCustomTopics(CodexLogLevel discV5, CodexLogLevel libp2p, CodexLogLevel blockExchange)
{
DiscV5 = discV5;
Libp2p = libp2p;
BlockExchange = blockExchange;
}
public CodexLogCustomTopics(CodexLogLevel discV5, CodexLogLevel libp2p)
{
DiscV5 = discV5;
Libp2p = libp2p;
}
public CodexLogLevel DiscV5 { get; set; }
public CodexLogLevel Libp2p { get; set; }
public CodexLogLevel ContractClock { get; set; } = CodexLogLevel.Warn;
2024-01-18 08:55:07 +00:00
public CodexLogLevel? BlockExchange { get; }
public CodexLogLevel JsonSerialize { get; set; } = CodexLogLevel.Warn;
}
2023-04-13 07:33:10 +00:00
public class CodexSetup : CodexStartupConfig, ICodexSetup
2023-04-12 14:06:04 +00:00
{
public int NumberOfNodes { get; }
public CodexSetup(int numberOfNodes)
2023-04-12 14:06:04 +00:00
{
NumberOfNodes = numberOfNodes;
}
public ICodexSetup WithName(string name)
{
NameOverride = name;
return this;
}
2023-09-25 06:47:19 +00:00
public ICodexSetup At(ILocation location)
2023-04-12 14:06:04 +00:00
{
Location = location;
return this;
}
2023-09-19 09:51:59 +00:00
public ICodexSetup WithBootstrapNode(ICodexNode node)
2023-04-19 12:57:00 +00:00
{
2024-03-26 07:58:16 +00:00
BootstrapSpr = node.GetDebugInfo().Spr;
2023-04-19 12:57:00 +00:00
return this;
}
2023-04-12 14:06:04 +00:00
public ICodexSetup WithLogLevel(CodexLogLevel level)
{
LogLevel = level;
return this;
}
public ICodexSetup WithLogLevel(CodexLogLevel level, CodexLogCustomTopics customTopics)
{
LogLevel = level;
CustomTopics = customTopics;
return this;
}
2023-04-13 07:33:10 +00:00
public ICodexSetup WithStorageQuota(ByteSize storageQuota)
2023-04-12 14:06:04 +00:00
{
StorageQuota = storageQuota;
return this;
}
public ICodexSetup WithBlockTTL(TimeSpan duration)
{
BlockTTL = Convert.ToInt32(duration.TotalSeconds);
return this;
}
public ICodexSetup WithBlockMaintenanceInterval(TimeSpan duration)
{
BlockMaintenanceInterval = duration;
return this;
}
public ICodexSetup WithBlockMaintenanceNumber(int numberOfBlocks)
{
BlockMaintenanceNumber = numberOfBlocks;
return this;
}
2023-09-13 09:59:21 +00:00
public ICodexSetup EnableMetrics()
{
MetricsEnabled = true;
return this;
}
2023-04-12 14:06:04 +00:00
public ICodexSetup EnableMarketplace(IGethNode gethNode, ICodexContracts codexContracts, Action<IMarketplaceSetup> marketplaceSetup)
2023-09-19 08:24:43 +00:00
{
var ms = new MarketplaceSetup();
marketplaceSetup(ms);
MarketplaceConfig = new MarketplaceInitialConfig(ms, gethNode, codexContracts);
2023-09-19 08:24:43 +00:00
return this;
}
public ICodexSetup WithSimulateProofFailures(uint failEveryNProofs)
{
SimulateProofFailures = failEveryNProofs;
return this;
}
public ICodexSetup AsPublicTestNet(CodexTestNetConfig testNetConfig)
{
PublicTestNet = testNetConfig;
return this;
}
2023-04-12 14:06:04 +00:00
public string Describe()
{
var args = string.Join(',', DescribeArgs());
2023-04-19 12:57:00 +00:00
return $"({NumberOfNodes} CodexNodes with args:[{args}])";
2023-04-12 14:06:04 +00:00
}
private IEnumerable<string> DescribeArgs()
{
if (PublicTestNet != null) yield return $"<!>Public TestNet with listenPort: {PublicTestNet.PublicListenPort}<!>";
yield return $"LogLevel={LogLevelWithTopics()}";
if (BootstrapSpr != null) yield return $"BootstrapNode={BootstrapSpr}";
if (StorageQuota != null) yield return $"StorageQuota={StorageQuota}";
if (SimulateProofFailures != null) yield return $"SimulateProofFailures={SimulateProofFailures}";
if (MarketplaceConfig != null) yield return $"MarketplaceSetup={MarketplaceConfig.MarketplaceSetup}";
2023-04-12 14:06:04 +00:00
}
}
public class MarketplaceSetup : IMarketplaceSetup
{
public bool IsStorageNode { get; private set; }
public bool IsValidator { get; private set; }
public Ether InitialEth { get; private set; } = 0.Eth();
public TestToken InitialTestTokens { get; private set; } = 0.Tst();
public EthAccountSetup EthAccountSetup { get; } = new EthAccountSetup();
public IMarketplaceSetup AsStorageNode()
{
IsStorageNode = true;
return this;
}
public IMarketplaceSetup AsValidator()
{
IsValidator = true;
return this;
}
public IMarketplaceSetup WithAccount(EthAccount account)
{
2024-05-24 14:11:51 +00:00
EthAccountSetup.Pin(account);
return this;
}
public IMarketplaceSetup WithInitial(Ether eth, TestToken tokens)
{
InitialEth = eth;
InitialTestTokens = tokens;
return this;
}
public override string ToString()
{
2024-03-13 09:29:26 +00:00
var result = "[(clientNode)"; // When marketplace is enabled, being a clientNode is implicit.
result += IsStorageNode ? "(storageNode)" : "()";
result += IsValidator ? "(validator)" : "() ";
result += $"Pinned address: '{EthAccountSetup}' ";
result += $"{InitialEth} / {InitialTestTokens}";
result += "] ";
return result;
}
}
2024-05-24 14:11:51 +00:00
public class EthAccountSetup
{
private readonly List<EthAccount> accounts = new List<EthAccount>();
private bool pinned = false;
public void Pin(EthAccount account)
{
accounts.Add(account);
pinned = true;
}
public EthAccount GetNew()
{
if (pinned) return accounts.Last();
var a = EthAccount.GenerateNew();
accounts.Add(a);
return a;
}
public EthAccount[] GetAll()
{
return accounts.ToArray();
}
public override string ToString()
{
if (!accounts.Any()) return "NoEthAccounts";
2024-05-24 14:11:51 +00:00
return string.Join(",", accounts.Select(a => a.ToString()).ToArray());
}
}
2023-04-12 14:06:04 +00:00
}