Setting up access to marketplace address
This commit is contained in:
parent
f06216b931
commit
9b38447dbe
|
@ -10,7 +10,7 @@
|
||||||
public long SizeInBytes { get; }
|
public long SizeInBytes { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class IntExtensions
|
public static class ByteSizeIntExtensions
|
||||||
{
|
{
|
||||||
private const long Kilo = 1024;
|
private const long Kilo = 1024;
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@ namespace DistTestCore
|
||||||
//ICodexStartupConfig WithBootstrapNode(IOnlineCodexNode node);
|
//ICodexStartupConfig WithBootstrapNode(IOnlineCodexNode node);
|
||||||
ICodexSetup WithStorageQuota(ByteSize storageQuota);
|
ICodexSetup WithStorageQuota(ByteSize storageQuota);
|
||||||
ICodexSetup EnableMetrics();
|
ICodexSetup EnableMetrics();
|
||||||
ICodexSetup EnableMarketplace(int initialBalance);
|
ICodexSetup EnableMarketplace(TestToken initialBalance);
|
||||||
|
ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther);
|
||||||
ICodexNodeGroup BringOnline();
|
ICodexNodeGroup BringOnline();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,9 +63,14 @@ namespace DistTestCore
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICodexSetup EnableMarketplace(int initialBalance)
|
public ICodexSetup EnableMarketplace(TestToken initialBalance)
|
||||||
{
|
{
|
||||||
MarketplaceConfig = new MarketplaceInitialConfig(initialBalance);
|
return EnableMarketplace(initialBalance, 1000.Eth());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther)
|
||||||
|
{
|
||||||
|
MarketplaceConfig = new MarketplaceInitialConfig(initialEther, initialBalance);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="nunit" Version="3.13.3" />
|
<PackageReference Include="nunit" Version="3.13.3" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||||
|
|
|
@ -5,13 +5,15 @@ namespace DistTestCore
|
||||||
{
|
{
|
||||||
public class GethStarter
|
public class GethStarter
|
||||||
{
|
{
|
||||||
private readonly GethBootstrapNodeCache bootstrapNodeCache;
|
private readonly MarketplaceNetworkCache marketplaceNetworkCache;
|
||||||
private readonly GethCompanionNodeStarter companionNodeStarter;
|
private readonly GethCompanionNodeStarter companionNodeStarter;
|
||||||
private readonly TestLifecycle lifecycle;
|
private readonly TestLifecycle lifecycle;
|
||||||
|
|
||||||
public GethStarter(TestLifecycle lifecycle, WorkflowCreator workflowCreator)
|
public GethStarter(TestLifecycle lifecycle, WorkflowCreator workflowCreator)
|
||||||
{
|
{
|
||||||
bootstrapNodeCache = new GethBootstrapNodeCache(new GethBootstrapNodeStarter(lifecycle, workflowCreator));
|
marketplaceNetworkCache = new MarketplaceNetworkCache(
|
||||||
|
new GethBootstrapNodeStarter(lifecycle, workflowCreator),
|
||||||
|
new CodexContractsStarter(lifecycle, workflowCreator));
|
||||||
companionNodeStarter = new GethCompanionNodeStarter(lifecycle, workflowCreator);
|
companionNodeStarter = new GethCompanionNodeStarter(lifecycle, workflowCreator);
|
||||||
this.lifecycle = lifecycle;
|
this.lifecycle = lifecycle;
|
||||||
}
|
}
|
||||||
|
@ -20,26 +22,28 @@ namespace DistTestCore
|
||||||
{
|
{
|
||||||
if (codexSetup.MarketplaceConfig == null) return CreateMarketplaceUnavailableResult();
|
if (codexSetup.MarketplaceConfig == null) return CreateMarketplaceUnavailableResult();
|
||||||
|
|
||||||
var bootstrapNode = bootstrapNodeCache.Get();
|
var marketplaceNetwork = marketplaceNetworkCache.Get();
|
||||||
var companionNodes = StartCompanionNodes(codexSetup, bootstrapNode);
|
var companionNodes = StartCompanionNodes(codexSetup, marketplaceNetwork);
|
||||||
|
|
||||||
TransferInitialBalance(bootstrapNode, codexSetup.MarketplaceConfig.InitialBalance, companionNodes);
|
TransferInitialBalance(marketplaceNetwork, codexSetup.MarketplaceConfig, companionNodes);
|
||||||
|
|
||||||
return CreateGethStartResult(bootstrapNode, companionNodes);
|
return CreateGethStartResult(marketplaceNetwork, companionNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TransferInitialBalance(GethBootstrapNodeInfo bootstrapNode, int initialBalance, GethCompanionNodeInfo[] companionNodes)
|
private void TransferInitialBalance(MarketplaceNetwork marketplaceNetwork, MarketplaceInitialConfig marketplaceConfig, GethCompanionNodeInfo[] companionNodes)
|
||||||
{
|
{
|
||||||
var interaction = bootstrapNode.StartInteraction(lifecycle.Log);
|
var interaction = marketplaceNetwork.StartInteraction(lifecycle.Log);
|
||||||
foreach (var node in companionNodes)
|
foreach (var node in companionNodes)
|
||||||
{
|
{
|
||||||
interaction.TransferTo(node.Account, initialBalance);
|
interaction.TransferTo(node.Account, marketplaceConfig.InitialEth.Wei);
|
||||||
|
// wrong level: mintTestTokens? interactions knows nothing about contract details!
|
||||||
|
//interaction.MintTestTokens(node.Account, marketplaceConfig.InitialTestTokens.Amount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private GethStartResult CreateGethStartResult(GethBootstrapNodeInfo bootstrapNode, GethCompanionNodeInfo[] companionNodes)
|
private GethStartResult CreateGethStartResult(MarketplaceNetwork marketplaceNetwork, GethCompanionNodeInfo[] companionNodes)
|
||||||
{
|
{
|
||||||
return new GethStartResult(CreateMarketplaceAccessFactory(bootstrapNode), bootstrapNode, companionNodes);
|
return new GethStartResult(CreateMarketplaceAccessFactory(marketplaceNetwork), marketplaceNetwork, companionNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GethStartResult CreateMarketplaceUnavailableResult()
|
private GethStartResult CreateMarketplaceUnavailableResult()
|
||||||
|
@ -47,34 +51,38 @@ namespace DistTestCore
|
||||||
return new GethStartResult(new MarketplaceUnavailableAccessFactory(), null!, Array.Empty<GethCompanionNodeInfo>());
|
return new GethStartResult(new MarketplaceUnavailableAccessFactory(), null!, Array.Empty<GethCompanionNodeInfo>());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IMarketplaceAccessFactory CreateMarketplaceAccessFactory(GethBootstrapNodeInfo bootstrapNode)
|
private IMarketplaceAccessFactory CreateMarketplaceAccessFactory(MarketplaceNetwork marketplaceNetwork)
|
||||||
{
|
{
|
||||||
return new GethMarketplaceAccessFactory(lifecycle.Log, bootstrapNode!);
|
return new GethMarketplaceAccessFactory(lifecycle.Log, marketplaceNetwork);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GethCompanionNodeInfo[] StartCompanionNodes(CodexSetup codexSetup, GethBootstrapNodeInfo bootstrapNode)
|
private GethCompanionNodeInfo[] StartCompanionNodes(CodexSetup codexSetup, MarketplaceNetwork marketplaceNetwork)
|
||||||
{
|
{
|
||||||
return companionNodeStarter.StartCompanionNodesFor(codexSetup, bootstrapNode);
|
return companionNodeStarter.StartCompanionNodesFor(codexSetup, marketplaceNetwork.Bootstrap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class GethBootstrapNodeCache
|
public class MarketplaceNetworkCache
|
||||||
{
|
{
|
||||||
private readonly GethBootstrapNodeStarter bootstrapNodeStarter;
|
private readonly GethBootstrapNodeStarter bootstrapNodeStarter;
|
||||||
private GethBootstrapNodeInfo? bootstrapNode;
|
private readonly CodexContractsStarter codexContractsStarter;
|
||||||
|
private MarketplaceNetwork? network;
|
||||||
|
|
||||||
public GethBootstrapNodeCache(GethBootstrapNodeStarter bootstrapNodeStarter)
|
public MarketplaceNetworkCache(GethBootstrapNodeStarter bootstrapNodeStarter, CodexContractsStarter codexContractsStarter)
|
||||||
{
|
{
|
||||||
this.bootstrapNodeStarter = bootstrapNodeStarter;
|
this.bootstrapNodeStarter = bootstrapNodeStarter;
|
||||||
|
this.codexContractsStarter = codexContractsStarter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GethBootstrapNodeInfo Get()
|
public MarketplaceNetwork Get()
|
||||||
{
|
{
|
||||||
if (bootstrapNode == null)
|
if (network == null)
|
||||||
{
|
{
|
||||||
bootstrapNode = bootstrapNodeStarter.StartGethBootstrapNode();
|
var bootstrapInfo = bootstrapNodeStarter.StartGethBootstrapNode();
|
||||||
|
var marketplaceInfo = codexContractsStarter.Start(bootstrapInfo.RunningContainers.Containers[0]);
|
||||||
|
network = new MarketplaceNetwork(bootstrapInfo, marketplaceInfo );
|
||||||
}
|
}
|
||||||
return bootstrapNode;
|
return network;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace DistTestCore.Marketplace
|
||||||
public class CodexContractsContainerRecipe : ContainerRecipeFactory
|
public class CodexContractsContainerRecipe : ContainerRecipeFactory
|
||||||
{
|
{
|
||||||
public const string DockerImage = "thatbenbierens/codex-contracts-deployment";
|
public const string DockerImage = "thatbenbierens/codex-contracts-deployment";
|
||||||
|
public const string MarketplaceAddressFilename = "/usr/app/deployments/codexdisttestnetwork/Marketplace.json";
|
||||||
|
|
||||||
protected override string Image => DockerImage;
|
protected override string Image => DockerImage;
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace DistTestCore.Marketplace
|
||||||
this.workflowCreator = workflowCreator;
|
this.workflowCreator = workflowCreator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Start(RunningContainer bootstrapContainer)
|
public MarketplaceInfo Start(RunningContainer bootstrapContainer)
|
||||||
{
|
{
|
||||||
var workflow = workflowCreator.CreateWorkflow();
|
var workflow = workflowCreator.CreateWorkflow();
|
||||||
var startupConfig = CreateStartupConfig(bootstrapContainer);
|
var startupConfig = CreateStartupConfig(bootstrapContainer);
|
||||||
|
@ -32,7 +32,12 @@ namespace DistTestCore.Marketplace
|
||||||
return logHandler.Found;
|
return logHandler.Found;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var extractor = new ContainerInfoExtractor(workflow, container);
|
||||||
|
var marketplaceAddress = extractor.ExtractMarketplaceAddress();
|
||||||
|
|
||||||
lifecycle.Log.Log("Contracts deployed.");
|
lifecycle.Log.Log("Contracts deployed.");
|
||||||
|
|
||||||
|
return new MarketplaceInfo(marketplaceAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WaitUntil(Func<bool> predicate)
|
private void WaitUntil(Func<bool> predicate)
|
||||||
|
@ -49,6 +54,16 @@ namespace DistTestCore.Marketplace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MarketplaceInfo
|
||||||
|
{
|
||||||
|
public MarketplaceInfo(string address)
|
||||||
|
{
|
||||||
|
Address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Address { get; }
|
||||||
|
}
|
||||||
|
|
||||||
public class ContractsReadyLogHandler : LogHandler
|
public class ContractsReadyLogHandler : LogHandler
|
||||||
{
|
{
|
||||||
private readonly string targetString;
|
private readonly string targetString;
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
using KubernetesWorkflow;
|
using KubernetesWorkflow;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace DistTestCore.Marketplace
|
namespace DistTestCore.Marketplace
|
||||||
{
|
{
|
||||||
public class GethInfoExtractor
|
public class ContainerInfoExtractor
|
||||||
{
|
{
|
||||||
private readonly StartupWorkflow workflow;
|
private readonly StartupWorkflow workflow;
|
||||||
private readonly RunningContainer container;
|
private readonly RunningContainer container;
|
||||||
|
|
||||||
public GethInfoExtractor(StartupWorkflow workflow, RunningContainer container)
|
public ContainerInfoExtractor(StartupWorkflow workflow, RunningContainer container)
|
||||||
{
|
{
|
||||||
this.workflow = workflow;
|
this.workflow = workflow;
|
||||||
this.container = container;
|
this.container = container;
|
||||||
|
@ -38,6 +39,14 @@ namespace DistTestCore.Marketplace
|
||||||
return pubKey;
|
return pubKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string ExtractMarketplaceAddress()
|
||||||
|
{
|
||||||
|
var marketplaceAddress = Retry(FetchMarketplaceAddress);
|
||||||
|
if (string.IsNullOrEmpty(marketplaceAddress)) throw new InvalidOperationException("Unable to fetch marketplace account from codex-contracts node. Test infra failure.");
|
||||||
|
|
||||||
|
return marketplaceAddress;
|
||||||
|
}
|
||||||
|
|
||||||
private string Retry(Func<string> fetch)
|
private string Retry(Func<string> fetch)
|
||||||
{
|
{
|
||||||
var result = Catch(fetch);
|
var result = Catch(fetch);
|
||||||
|
@ -71,6 +80,13 @@ namespace DistTestCore.Marketplace
|
||||||
return workflow.ExecuteCommand(container, "cat", GethContainerRecipe.AccountFilename);
|
return workflow.ExecuteCommand(container, "cat", GethContainerRecipe.AccountFilename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string FetchMarketplaceAddress()
|
||||||
|
{
|
||||||
|
var json = workflow.ExecuteCommand(container, "cat", CodexContractsContainerRecipe.MarketplaceAddressFilename);
|
||||||
|
var marketplace = JsonConvert.DeserializeObject<MarketplaceJson>(json);
|
||||||
|
return marketplace!.address;
|
||||||
|
}
|
||||||
|
|
||||||
private string FetchPubKey()
|
private string FetchPubKey()
|
||||||
{
|
{
|
||||||
var enodeFinder = new PubKeyFinder();
|
var enodeFinder = new PubKeyFinder();
|
||||||
|
@ -107,4 +123,9 @@ namespace DistTestCore.Marketplace
|
||||||
length: closeIndex - openIndex);
|
length: closeIndex - openIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MarketplaceJson
|
||||||
|
{
|
||||||
|
public string address { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,4 @@
|
||||||
using KubernetesWorkflow;
|
using KubernetesWorkflow;
|
||||||
using Logging;
|
|
||||||
using NethereumWorkflow;
|
|
||||||
|
|
||||||
namespace DistTestCore.Marketplace
|
namespace DistTestCore.Marketplace
|
||||||
{
|
{
|
||||||
|
@ -20,14 +18,5 @@ namespace DistTestCore.Marketplace
|
||||||
public string GenesisJsonBase64 { get; }
|
public string GenesisJsonBase64 { get; }
|
||||||
public string PubKey { get; }
|
public string PubKey { get; }
|
||||||
public Port DiscoveryPort { get; }
|
public Port DiscoveryPort { get; }
|
||||||
|
|
||||||
public NethereumInteraction StartInteraction(TestLog log)
|
|
||||||
{
|
|
||||||
var ip = RunningContainers.RunningPod.Cluster.IP;
|
|
||||||
var port = RunningContainers.Containers[0].ServicePorts[0].Number;
|
|
||||||
|
|
||||||
var creator = new NethereumInteractionCreator(log, ip, port, Account);
|
|
||||||
return creator.CreateWorkflow();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,13 +7,11 @@ namespace DistTestCore.Marketplace
|
||||||
private const string bootstrapGenesisJsonBase64 = "ewogICAgImNvbmZpZyI6IHsKICAgICAgImNoYWluSWQiOiA3ODk5ODgsCiAgICAgICJob21lc3RlYWRCbG9jayI6IDAsCiAgICAgICJlaXAxNTBCbG9jayI6IDAsCiAgICAgICJlaXAxNTVCbG9jayI6IDAsCiAgICAgICJlaXAxNThCbG9jayI6IDAsCiAgICAgICJieXphbnRpdW1CbG9jayI6IDAsCiAgICAgICJjb25zdGFudGlub3BsZUJsb2NrIjogMCwKICAgICAgInBldGVyc2J1cmdCbG9jayI6IDAsCiAgICAgICJpc3RhbmJ1bEJsb2NrIjogMCwKICAgICAgIm11aXJHbGFjaWVyQmxvY2siOiAwLAogICAgICAiYmVybGluQmxvY2siOiAwLAogICAgICAibG9uZG9uQmxvY2siOiAwLAogICAgICAiYXJyb3dHbGFjaWVyQmxvY2siOiAwLAogICAgICAiZ3JheUdsYWNpZXJCbG9jayI6IDAsCiAgICAgICJjbGlxdWUiOiB7CiAgICAgICAgInBlcmlvZCI6IDUsCiAgICAgICAgImVwb2NoIjogMzAwMDAKICAgICAgfQogICAgfSwKICAgICJkaWZmaWN1bHR5IjogIjEiLAogICAgImdhc0xpbWl0IjogIjgwMDAwMDAwMCIsCiAgICAiZXh0cmFkYXRhIjogIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFDQ09VTlRfSEVSRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAogICAgImFsbG9jIjogewogICAgICAiMHhBQ0NPVU5UX0hFUkUiOiB7ICJiYWxhbmNlIjogIjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiIH0KICAgIH0KICB9";
|
private const string bootstrapGenesisJsonBase64 = "ewogICAgImNvbmZpZyI6IHsKICAgICAgImNoYWluSWQiOiA3ODk5ODgsCiAgICAgICJob21lc3RlYWRCbG9jayI6IDAsCiAgICAgICJlaXAxNTBCbG9jayI6IDAsCiAgICAgICJlaXAxNTVCbG9jayI6IDAsCiAgICAgICJlaXAxNThCbG9jayI6IDAsCiAgICAgICJieXphbnRpdW1CbG9jayI6IDAsCiAgICAgICJjb25zdGFudGlub3BsZUJsb2NrIjogMCwKICAgICAgInBldGVyc2J1cmdCbG9jayI6IDAsCiAgICAgICJpc3RhbmJ1bEJsb2NrIjogMCwKICAgICAgIm11aXJHbGFjaWVyQmxvY2siOiAwLAogICAgICAiYmVybGluQmxvY2siOiAwLAogICAgICAibG9uZG9uQmxvY2siOiAwLAogICAgICAiYXJyb3dHbGFjaWVyQmxvY2siOiAwLAogICAgICAiZ3JheUdsYWNpZXJCbG9jayI6IDAsCiAgICAgICJjbGlxdWUiOiB7CiAgICAgICAgInBlcmlvZCI6IDUsCiAgICAgICAgImVwb2NoIjogMzAwMDAKICAgICAgfQogICAgfSwKICAgICJkaWZmaWN1bHR5IjogIjEiLAogICAgImdhc0xpbWl0IjogIjgwMDAwMDAwMCIsCiAgICAiZXh0cmFkYXRhIjogIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEFDQ09VTlRfSEVSRTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAogICAgImFsbG9jIjogewogICAgICAiMHhBQ0NPVU5UX0hFUkUiOiB7ICJiYWxhbmNlIjogIjUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiIH0KICAgIH0KICB9";
|
||||||
private readonly TestLifecycle lifecycle;
|
private readonly TestLifecycle lifecycle;
|
||||||
private readonly WorkflowCreator workflowCreator;
|
private readonly WorkflowCreator workflowCreator;
|
||||||
private readonly CodexContractsStarter codexContractsStarter;
|
|
||||||
|
|
||||||
public GethBootstrapNodeStarter(TestLifecycle lifecycle, WorkflowCreator workflowCreator)
|
public GethBootstrapNodeStarter(TestLifecycle lifecycle, WorkflowCreator workflowCreator)
|
||||||
{
|
{
|
||||||
this.lifecycle = lifecycle;
|
this.lifecycle = lifecycle;
|
||||||
this.workflowCreator = workflowCreator;
|
this.workflowCreator = workflowCreator;
|
||||||
codexContractsStarter = new CodexContractsStarter(lifecycle, workflowCreator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GethBootstrapNodeInfo StartGethBootstrapNode()
|
public GethBootstrapNodeInfo StartGethBootstrapNode()
|
||||||
|
@ -26,7 +24,7 @@ namespace DistTestCore.Marketplace
|
||||||
if (containers.Containers.Length != 1) throw new InvalidOperationException("Expected 1 Geth bootstrap node to be created. Test infra failure.");
|
if (containers.Containers.Length != 1) throw new InvalidOperationException("Expected 1 Geth bootstrap node to be created. Test infra failure.");
|
||||||
var bootstrapContainer = containers.Containers[0];
|
var bootstrapContainer = containers.Containers[0];
|
||||||
|
|
||||||
var extractor = new GethInfoExtractor(workflow, bootstrapContainer);
|
var extractor = new ContainerInfoExtractor(workflow, bootstrapContainer);
|
||||||
var account = extractor.ExtractAccount();
|
var account = extractor.ExtractAccount();
|
||||||
var genesisJsonBase64 = extractor.ExtractGenesisJsonBase64();
|
var genesisJsonBase64 = extractor.ExtractGenesisJsonBase64();
|
||||||
var pubKey = extractor.ExtractPubKey();
|
var pubKey = extractor.ExtractPubKey();
|
||||||
|
@ -34,16 +32,9 @@ namespace DistTestCore.Marketplace
|
||||||
|
|
||||||
Log($"Geth bootstrap node started with account '{account}'");
|
Log($"Geth bootstrap node started with account '{account}'");
|
||||||
|
|
||||||
DeployCodexContracts(bootstrapContainer);
|
|
||||||
|
|
||||||
return new GethBootstrapNodeInfo(containers, account, genesisJsonBase64, pubKey, discoveryPort);
|
return new GethBootstrapNodeInfo(containers, account, genesisJsonBase64, pubKey, discoveryPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DeployCodexContracts(RunningContainer bootstrapContainer)
|
|
||||||
{
|
|
||||||
codexContractsStarter.Start(bootstrapContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
private StartupConfig CreateBootstrapStartupConfig()
|
private StartupConfig CreateBootstrapStartupConfig()
|
||||||
{
|
{
|
||||||
var config = new StartupConfig();
|
var config = new StartupConfig();
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace DistTestCore.Marketplace
|
||||||
|
|
||||||
private GethCompanionNodeInfo CreateCompanionInfo(StartupWorkflow workflow, RunningContainer container)
|
private GethCompanionNodeInfo CreateCompanionInfo(StartupWorkflow workflow, RunningContainer container)
|
||||||
{
|
{
|
||||||
var extractor = new GethInfoExtractor(workflow, container);
|
var extractor = new ContainerInfoExtractor(workflow, container);
|
||||||
var account = extractor.ExtractAccount();
|
var account = extractor.ExtractAccount();
|
||||||
return new GethCompanionNodeInfo(container, account);
|
return new GethCompanionNodeInfo(container, account);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,15 +2,15 @@
|
||||||
{
|
{
|
||||||
public class GethStartResult
|
public class GethStartResult
|
||||||
{
|
{
|
||||||
public GethStartResult(IMarketplaceAccessFactory marketplaceAccessFactory, GethBootstrapNodeInfo bootstrapNode, GethCompanionNodeInfo[] companionNodes)
|
public GethStartResult(IMarketplaceAccessFactory marketplaceAccessFactory, MarketplaceNetwork marketplaceNetwork, GethCompanionNodeInfo[] companionNodes)
|
||||||
{
|
{
|
||||||
MarketplaceAccessFactory = marketplaceAccessFactory;
|
MarketplaceAccessFactory = marketplaceAccessFactory;
|
||||||
BootstrapNode = bootstrapNode;
|
MarketplaceNetwork = marketplaceNetwork;
|
||||||
CompanionNodes = companionNodes;
|
CompanionNodes = companionNodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMarketplaceAccessFactory MarketplaceAccessFactory { get; }
|
public IMarketplaceAccessFactory MarketplaceAccessFactory { get; }
|
||||||
public GethBootstrapNodeInfo BootstrapNode { get; }
|
public MarketplaceNetwork MarketplaceNetwork { get; }
|
||||||
public GethCompanionNodeInfo[] CompanionNodes { get; }
|
public GethCompanionNodeInfo[] CompanionNodes { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,13 +15,13 @@ namespace DistTestCore.Marketplace
|
||||||
public class MarketplaceAccess : IMarketplaceAccess
|
public class MarketplaceAccess : IMarketplaceAccess
|
||||||
{
|
{
|
||||||
private readonly TestLog log;
|
private readonly TestLog log;
|
||||||
private readonly GethBootstrapNodeInfo bootstrapNode;
|
private readonly MarketplaceNetwork marketplaceNetwork;
|
||||||
private readonly GethCompanionNodeInfo companionNode;
|
private readonly GethCompanionNodeInfo companionNode;
|
||||||
|
|
||||||
public MarketplaceAccess(TestLog log, GethBootstrapNodeInfo bootstrapNode, GethCompanionNodeInfo companionNode)
|
public MarketplaceAccess(TestLog log, MarketplaceNetwork marketplaceNetwork, GethCompanionNodeInfo companionNode)
|
||||||
{
|
{
|
||||||
this.log = log;
|
this.log = log;
|
||||||
this.bootstrapNode = bootstrapNode;
|
this.marketplaceNetwork = marketplaceNetwork;
|
||||||
this.companionNode = companionNode;
|
this.companionNode = companionNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ namespace DistTestCore.Marketplace
|
||||||
|
|
||||||
public decimal GetBalance()
|
public decimal GetBalance()
|
||||||
{
|
{
|
||||||
var interaction = bootstrapNode.StartInteraction(log);
|
var interaction = marketplaceNetwork.StartInteraction(log);
|
||||||
return interaction.GetBalance(companionNode.Account);
|
return interaction.GetBalance(companionNode.Account);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,18 +19,18 @@ namespace DistTestCore.Marketplace
|
||||||
public class GethMarketplaceAccessFactory : IMarketplaceAccessFactory
|
public class GethMarketplaceAccessFactory : IMarketplaceAccessFactory
|
||||||
{
|
{
|
||||||
private readonly TestLog log;
|
private readonly TestLog log;
|
||||||
private readonly GethBootstrapNodeInfo bootstrapNode;
|
private readonly MarketplaceNetwork marketplaceNetwork;
|
||||||
|
|
||||||
public GethMarketplaceAccessFactory(TestLog log, GethBootstrapNodeInfo bootstrapNode)
|
public GethMarketplaceAccessFactory(TestLog log, MarketplaceNetwork marketplaceNetwork)
|
||||||
{
|
{
|
||||||
this.log = log;
|
this.log = log;
|
||||||
this.bootstrapNode = bootstrapNode;
|
this.marketplaceNetwork = marketplaceNetwork;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMarketplaceAccess CreateMarketplaceAccess(CodexAccess access)
|
public IMarketplaceAccess CreateMarketplaceAccess(CodexAccess access)
|
||||||
{
|
{
|
||||||
var companionNode = GetGethCompanionNode(access);
|
var companionNode = GetGethCompanionNode(access);
|
||||||
return new MarketplaceAccess(log, bootstrapNode, companionNode);
|
return new MarketplaceAccess(log, marketplaceNetwork, companionNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
private GethCompanionNodeInfo GetGethCompanionNode(CodexAccess access)
|
private GethCompanionNodeInfo GetGethCompanionNode(CodexAccess access)
|
||||||
|
|
|
@ -2,11 +2,13 @@
|
||||||
{
|
{
|
||||||
public class MarketplaceInitialConfig
|
public class MarketplaceInitialConfig
|
||||||
{
|
{
|
||||||
public MarketplaceInitialConfig(int initialBalance)
|
public MarketplaceInitialConfig(Ether initialEth, TestToken initialTestTokens)
|
||||||
{
|
{
|
||||||
InitialBalance = initialBalance;
|
InitialEth = initialEth;
|
||||||
|
InitialTestTokens = initialTestTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int InitialBalance { get; }
|
public Ether InitialEth { get; }
|
||||||
|
public TestToken InitialTestTokens { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
using Logging;
|
||||||
|
using NethereumWorkflow;
|
||||||
|
|
||||||
|
namespace DistTestCore.Marketplace
|
||||||
|
{
|
||||||
|
public class MarketplaceNetwork
|
||||||
|
{
|
||||||
|
public MarketplaceNetwork(GethBootstrapNodeInfo bootstrap, MarketplaceInfo marketplace)
|
||||||
|
{
|
||||||
|
Bootstrap = bootstrap;
|
||||||
|
Marketplace = marketplace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GethBootstrapNodeInfo Bootstrap { get; }
|
||||||
|
public MarketplaceInfo Marketplace { get; }
|
||||||
|
|
||||||
|
public NethereumInteraction StartInteraction(TestLog log)
|
||||||
|
{
|
||||||
|
var ip = Bootstrap.RunningContainers.RunningPod.Cluster.IP;
|
||||||
|
var port = Bootstrap.RunningContainers.Containers[0].ServicePorts[0].Number;
|
||||||
|
var account = Bootstrap.Account;
|
||||||
|
|
||||||
|
var creator = new NethereumInteractionCreator(log, ip, port, account);
|
||||||
|
return creator.CreateWorkflow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
namespace DistTestCore
|
||||||
|
{
|
||||||
|
public class Ether
|
||||||
|
{
|
||||||
|
public Ether(decimal wei)
|
||||||
|
{
|
||||||
|
Wei = wei;
|
||||||
|
}
|
||||||
|
|
||||||
|
public decimal Wei { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestToken
|
||||||
|
{
|
||||||
|
public TestToken(decimal amount)
|
||||||
|
{
|
||||||
|
Amount = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public decimal Amount { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class TokensIntExtensions
|
||||||
|
{
|
||||||
|
private const decimal weiPerEth = 1000000000000000000;
|
||||||
|
|
||||||
|
public static TestToken TestTokens(this int i)
|
||||||
|
{
|
||||||
|
return TestTokens(Convert.ToDecimal(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TestToken TestTokens(this decimal i)
|
||||||
|
{
|
||||||
|
return new TestToken(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Ether Eth(this int i)
|
||||||
|
{
|
||||||
|
return Eth(Convert.ToDecimal(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Ether Wei(this int i)
|
||||||
|
{
|
||||||
|
return Wei(Convert.ToDecimal(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Ether Eth(this decimal i)
|
||||||
|
{
|
||||||
|
return new Ether(i * weiPerEth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Ether Wei(this decimal i)
|
||||||
|
{
|
||||||
|
return new Ether(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,14 @@ namespace NethereumWorkflow
|
||||||
Log($"Transferred {amount} to {account}");
|
Log($"Transferred {amount} to {account}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void MintTestTokens(string account, decimal amount)
|
||||||
|
{
|
||||||
|
if (amount < 1 || string.IsNullOrEmpty(account)) throw new ArgumentException("Invalid arguments for MintTestTokens");
|
||||||
|
|
||||||
|
// - address of token? -> address of marketplace?
|
||||||
|
// - nethereum do contract call
|
||||||
|
}
|
||||||
|
|
||||||
public decimal GetBalance(string account)
|
public decimal GetBalance(string account)
|
||||||
{
|
{
|
||||||
var bigInt = Time.Wait(web3.Eth.GetBalance.SendRequestAsync(account));
|
var bigInt = Time.Wait(web3.Eth.GetBalance.SendRequestAsync(account));
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace Tests.BasicTests
|
||||||
{
|
{
|
||||||
var group = SetupCodexNodes(2)
|
var group = SetupCodexNodes(2)
|
||||||
.WithStorageQuota(10.GB())
|
.WithStorageQuota(10.GB())
|
||||||
.EnableMarketplace(initialBalance: 20)
|
.EnableMarketplace(20.TestTokens())
|
||||||
.BringOnline();
|
.BringOnline();
|
||||||
|
|
||||||
foreach (var node in group)
|
foreach (var node in group)
|
||||||
|
|
Loading…
Reference in New Issue