78 lines
3.2 KiB
C#
78 lines
3.2 KiB
C#
using KubernetesWorkflow;
|
|
using Utils;
|
|
|
|
namespace DistTestCore.Marketplace
|
|
{
|
|
public class GethCompanionNodeStarter : BaseStarter
|
|
{
|
|
private int companionAccountIndex = 0;
|
|
|
|
public GethCompanionNodeStarter(TestLifecycle lifecycle)
|
|
: base(lifecycle)
|
|
{
|
|
}
|
|
|
|
public GethCompanionNodeInfo StartCompanionNodeFor(CodexSetup codexSetup, MarketplaceNetwork marketplace)
|
|
{
|
|
LogStart($"Initializing companion for {codexSetup.NumberOfNodes} Codex nodes.");
|
|
|
|
var config = CreateCompanionNodeStartupConfig(marketplace.Bootstrap, codexSetup.NumberOfNodes);
|
|
|
|
var workflow = lifecycle.WorkflowCreator.CreateWorkflow();
|
|
var containers = workflow.Start(1, Location.Unspecified, new GethContainerRecipe(), CreateStartupConfig(config));
|
|
if (containers.Containers.Length != 1) throw new InvalidOperationException("Expected one Geth companion node to be created. Test infra failure.");
|
|
var container = containers.Containers[0];
|
|
|
|
var node = CreateCompanionInfo(container, marketplace, config);
|
|
EnsureCompanionNodeIsSynced(node, marketplace);
|
|
|
|
LogEnd($"Initialized one companion node for {codexSetup.NumberOfNodes} Codex nodes. Their accounts: [{string.Join(",", node.Accounts.Select(a => a.Account))}]");
|
|
return node;
|
|
}
|
|
|
|
private GethCompanionNodeInfo CreateCompanionInfo(RunningContainer container, MarketplaceNetwork marketplace, GethStartupConfig config)
|
|
{
|
|
var accounts = ExtractAccounts(marketplace, config);
|
|
return new GethCompanionNodeInfo(container, accounts);
|
|
}
|
|
|
|
private static GethAccount[] ExtractAccounts(MarketplaceNetwork marketplace, GethStartupConfig config)
|
|
{
|
|
return marketplace.Bootstrap.AllAccounts.Accounts
|
|
.Skip(1 + config.CompanionAccountStartIndex)
|
|
.Take(config.NumberOfCompanionAccounts)
|
|
.ToArray();
|
|
}
|
|
|
|
private void EnsureCompanionNodeIsSynced(GethCompanionNodeInfo node, MarketplaceNetwork marketplace)
|
|
{
|
|
try
|
|
{
|
|
Time.WaitUntil(() =>
|
|
{
|
|
var interaction = node.StartInteraction(lifecycle, node.Accounts.First());
|
|
return interaction.IsSynced(marketplace.Marketplace.Address, marketplace.Marketplace.Abi);
|
|
}, TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(3));
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw new Exception("Geth companion node did not sync within timeout. Test infra failure.", e);
|
|
}
|
|
}
|
|
|
|
private GethStartupConfig CreateCompanionNodeStartupConfig(GethBootstrapNodeInfo bootstrapNode, int numberOfAccounts)
|
|
{
|
|
var config = new GethStartupConfig(false, bootstrapNode, companionAccountIndex, numberOfAccounts);
|
|
companionAccountIndex += numberOfAccounts;
|
|
return config;
|
|
}
|
|
|
|
private StartupConfig CreateStartupConfig(GethStartupConfig gethConfig)
|
|
{
|
|
var config = new StartupConfig();
|
|
config.Add(gethConfig);
|
|
return config;
|
|
}
|
|
}
|
|
}
|