Sets serialization gate between each deploy and wrap to ensure application lifecycle invariance.

This commit is contained in:
benbierens 2023-09-20 09:16:57 +02:00
parent cedaf84740
commit 5fa4e0ff9f
No known key found for this signature in database
GPG Key ID: FE44815D96D0A1AA
16 changed files with 110 additions and 46 deletions

View File

@ -5,7 +5,7 @@ namespace CodexContractsPlugin
{ {
public interface ICodexContracts public interface ICodexContracts
{ {
string MarketplaceAddress { get; } ICodexContractsDeployment Deployment { get; }
void MintTestTokens(IGethNode gethNode, IHasEthAddress owner, TestToken testTokens); void MintTestTokens(IGethNode gethNode, IHasEthAddress owner, TestToken testTokens);
void MintTestTokens(IGethNode gethNode, IEthAddress ethAddress, TestToken testTokens); void MintTestTokens(IGethNode gethNode, IEthAddress ethAddress, TestToken testTokens);
@ -17,17 +17,13 @@ namespace CodexContractsPlugin
{ {
private readonly ILog log; private readonly ILog log;
public CodexContractsAccess(ILog log, string marketplaceAddress, string abi, string tokenAddress) public CodexContractsAccess(ILog log, ICodexContractsDeployment deployment)
{ {
this.log = log; this.log = log;
MarketplaceAddress = marketplaceAddress; Deployment = deployment;
Abi = abi;
TokenAddress = tokenAddress;
} }
public string MarketplaceAddress { get; } public ICodexContractsDeployment Deployment { get; }
public string Abi { get; }
public string TokenAddress { get; }
public void MintTestTokens(IGethNode gethNode, IHasEthAddress owner, TestToken testTokens) public void MintTestTokens(IGethNode gethNode, IHasEthAddress owner, TestToken testTokens)
{ {
@ -37,7 +33,7 @@ namespace CodexContractsPlugin
public void MintTestTokens(IGethNode gethNode, IEthAddress ethAddress, TestToken testTokens) public void MintTestTokens(IGethNode gethNode, IEthAddress ethAddress, TestToken testTokens)
{ {
var interaction = new ContractInteractions(log, gethNode); var interaction = new ContractInteractions(log, gethNode);
interaction.MintTestTokens(ethAddress, testTokens.Amount, TokenAddress); interaction.MintTestTokens(ethAddress, testTokens.Amount, Deployment.TokenAddress);
} }
public TestToken GetTestTokenBalance(IGethNode gethNode, IHasEthAddress owner) public TestToken GetTestTokenBalance(IGethNode gethNode, IHasEthAddress owner)
@ -48,7 +44,7 @@ namespace CodexContractsPlugin
public TestToken GetTestTokenBalance(IGethNode gethNode, IEthAddress ethAddress) public TestToken GetTestTokenBalance(IGethNode gethNode, IEthAddress ethAddress)
{ {
var interaction = new ContractInteractions(log, gethNode); var interaction = new ContractInteractions(log, gethNode);
var balance = interaction.GetBalance(TokenAddress, ethAddress.Address); var balance = interaction.GetBalance(Deployment.TokenAddress, ethAddress.Address);
return balance.TestTokens(); return balance.TestTokens();
} }
} }

View File

@ -0,0 +1,23 @@
namespace CodexContractsPlugin
{
public interface ICodexContractsDeployment
{
string MarketplaceAddress { get; }
string Abi { get; }
string TokenAddress { get; }
}
public class CodexContractsDeployment : ICodexContractsDeployment
{
public CodexContractsDeployment(string marketplaceAddress, string abi, string tokenAddress)
{
MarketplaceAddress = marketplaceAddress;
Abi = abi;
TokenAddress = tokenAddress;
}
public string MarketplaceAddress { get; }
public string Abi { get; }
public string TokenAddress { get; }
}
}

View File

@ -30,9 +30,14 @@ namespace CodexContractsPlugin
{ {
} }
public ICodexContracts DeployContracts(IGethNode gethNode) public ICodexContractsDeployment DeployContracts(IGethNode gethNode)
{ {
return starter.Start(gethNode); return starter.Deploy(gethNode);
}
public ICodexContracts WrapDeploy(ICodexContractsDeployment deployment)
{
return starter.Wrap(SerializeGate.Gate(deployment));
} }
} }
} }

View File

@ -15,7 +15,7 @@ namespace CodexContractsPlugin
this.tools = tools; this.tools = tools;
} }
public ICodexContracts Start(IGethNode gethNode) public ICodexContractsDeployment Deploy(IGethNode gethNode)
{ {
Log("Deploying Codex SmartContracts..."); Log("Deploying Codex SmartContracts...");
@ -47,7 +47,12 @@ namespace CodexContractsPlugin
Log("Synced. Codex SmartContracts deployed."); Log("Synced. Codex SmartContracts deployed.");
return new CodexContractsAccess(tools.GetLog(), marketplaceAddress, abi, tokenAddress); return new CodexContractsDeployment(marketplaceAddress, abi, tokenAddress);
}
public ICodexContracts Wrap(ICodexContractsDeployment deployment)
{
return new CodexContractsAccess(tools.GetLog(), deployment);
} }
private void Log(string msg) private void Log(string msg)

View File

@ -5,11 +5,22 @@ namespace CodexContractsPlugin
{ {
public static class CoreInterfaceExtensions public static class CoreInterfaceExtensions
{ {
public static ICodexContracts DeployCodexContracts(this CoreInterface ci, IGethNode gethNode) public static ICodexContractsDeployment DeployCodexContracts(this CoreInterface ci, IGethNode gethNode)
{ {
return Plugin(ci).DeployContracts(gethNode); return Plugin(ci).DeployContracts(gethNode);
} }
public static ICodexContracts WrapCodexContractsDeployment(this CoreInterface ci, ICodexContractsDeployment deployment)
{
return Plugin(ci).WrapDeploy(deployment);
}
public static ICodexContracts StartCodexContracts(this CoreInterface ci, IGethNode gethNode)
{
var deployment = DeployCodexContracts(ci, gethNode);
return WrapCodexContractsDeployment(ci, deployment);
}
private static CodexContractsPlugin Plugin(CoreInterface ci) private static CodexContractsPlugin Plugin(CoreInterface ci)
{ {
return ci.GetPlugin<CodexContractsPlugin>(); return ci.GetPlugin<CodexContractsPlugin>();

View File

@ -26,8 +26,8 @@ namespace CodexPlugin
protected override void Initialize(StartupConfig startupConfig) protected override void Initialize(StartupConfig startupConfig)
{ {
SetResourcesRequest(milliCPUs: 1000, memory: 6.GB()); //SetResourcesRequest(milliCPUs: 1000, memory: 6.GB());
SetResourceLimits(milliCPUs: 4000, memory: 12.GB()); //SetResourceLimits(milliCPUs: 4000, memory: 12.GB());
var config = startupConfig.Get<CodexStartupConfig>(); var config = startupConfig.Get<CodexStartupConfig>();
@ -83,7 +83,7 @@ namespace CodexPlugin
var gethStart = mconfig.GethNode.StartResult; var gethStart = mconfig.GethNode.StartResult;
var ip = gethStart.RunningContainer.Pod.PodInfo.Ip; var ip = gethStart.RunningContainer.Pod.PodInfo.Ip;
var port = gethStart.WsPort.Number; var port = gethStart.WsPort.Number;
var marketplaceAddress = mconfig.CodexContracts.MarketplaceAddress; var marketplaceAddress = mconfig.CodexContracts.Deployment.MarketplaceAddress;
AddEnvVar("CODEX_ETH_PROVIDER", $"ws://{ip}:{port}"); AddEnvVar("CODEX_ETH_PROVIDER", $"ws://{ip}:{port}");
AddEnvVar("CODEX_MARKETPLACE_ADDRESS", marketplaceAddress); AddEnvVar("CODEX_MARKETPLACE_ADDRESS", marketplaceAddress);

View File

@ -39,7 +39,8 @@ namespace CodexPlugin
public ICodexNodeGroup WrapCodexContainers(CoreInterface coreInterface, RunningContainers[] containers) public ICodexNodeGroup WrapCodexContainers(CoreInterface coreInterface, RunningContainers[] containers)
{ {
return codexStarter.WrapCodexContainers(coreInterface, containers); var cs = containers.Select(c => SerializeGate.Gate(c)).ToArray();
return codexStarter.WrapCodexContainers(coreInterface, cs);
} }
public void WireUpMarketplace(ICodexNodeGroup result, Action<ICodexSetup> setup) public void WireUpMarketplace(ICodexNodeGroup result, Action<ICodexSetup> setup)

13
Core/SerializeGate.cs Normal file
View File

@ -0,0 +1,13 @@
using Newtonsoft.Json;
namespace Core
{
public static class SerializeGate
{
public static T Gate<T>(T anything)
{
var json = JsonConvert.SerializeObject(anything);
return JsonConvert.DeserializeObject<T>(json)!;
}
}
}

View File

@ -4,10 +4,20 @@ namespace GethPlugin
{ {
public static class CoreInterfaceExtensions public static class CoreInterfaceExtensions
{ {
public static IGethDeployment DeployGeth(this CoreInterface ci, Action<IGethSetup> setup)
{
return Plugin(ci).DeployGeth(setup);
}
public static IGethNode WrapGethDeployment(this CoreInterface ci, IGethDeployment deployment)
{
return Plugin(ci).WrapGethDeployment(deployment);
}
public static IGethNode StartGethNode(this CoreInterface ci, Action<IGethSetup> setup) public static IGethNode StartGethNode(this CoreInterface ci, Action<IGethSetup> setup)
{ {
var p = Plugin(ci); var deploy = DeployGeth(ci, setup);
return p.WrapGethContainer(p.StartGeth(setup)); return WrapGethDeployment(ci, deploy);
} }
private static GethPlugin Plugin(CoreInterface ci) private static GethPlugin Plugin(CoreInterface ci)

View File

@ -2,7 +2,7 @@
namespace GethPlugin namespace GethPlugin
{ {
public interface IGethStartResult public interface IGethDeployment
{ {
RunningContainer RunningContainer { get; } RunningContainer RunningContainer { get; }
Port DiscoveryPort { get; } Port DiscoveryPort { get; }
@ -12,9 +12,9 @@ namespace GethPlugin
string PubKey { get; } string PubKey { get; }
} }
public class GethStartResult : IGethStartResult public class GethDeployment : IGethDeployment
{ {
public GethStartResult(RunningContainer runningContainer, Port discoveryPort, Port httpPort, Port wsPort, AllGethAccounts allAccounts, string pubKey) public GethDeployment(RunningContainer runningContainer, Port discoveryPort, Port httpPort, Port wsPort, AllGethAccounts allAccounts, string pubKey)
{ {
RunningContainer = runningContainer; RunningContainer = runningContainer;
DiscoveryPort = discoveryPort; DiscoveryPort = discoveryPort;

View File

@ -6,7 +6,7 @@ namespace GethPlugin
{ {
public interface IGethNode public interface IGethNode
{ {
IGethStartResult StartResult { get; } IGethDeployment StartResult { get; }
Ether GetEthBalance(); Ether GetEthBalance();
Ether GetEthBalance(IHasEthAddress address); Ether GetEthBalance(IHasEthAddress address);
@ -23,14 +23,14 @@ namespace GethPlugin
{ {
private readonly ILog log; private readonly ILog log;
public GethNode(ILog log, IGethStartResult startResult) public GethNode(ILog log, IGethDeployment startResult)
{ {
this.log = log; this.log = log;
StartResult = startResult; StartResult = startResult;
Account = startResult.AllAccounts.Accounts.First(); Account = startResult.AllAccounts.Accounts.First();
} }
public IGethStartResult StartResult { get; } public IGethDeployment StartResult { get; }
public GethAccount Account { get; } public GethAccount Account { get; }
public Ether GetEthBalance() public Ether GetEthBalance()

View File

@ -29,16 +29,16 @@ namespace GethPlugin
{ {
} }
public IGethStartResult StartGeth(Action<IGethSetup> setup) public IGethDeployment DeployGeth(Action<IGethSetup> setup)
{ {
var startupConfig = new GethStartupConfig(); var startupConfig = new GethStartupConfig();
setup(startupConfig); setup(startupConfig);
return starter.StartGeth(startupConfig); return starter.StartGeth(startupConfig);
} }
public IGethNode WrapGethContainer(IGethStartResult startResult) public IGethNode WrapGethDeployment(IGethDeployment startResult)
{ {
return starter.WrapGethContainer(startResult); return starter.WrapGethContainer(SerializeGate.Gate(startResult));
} }
} }
} }

View File

@ -12,7 +12,7 @@ namespace GethPlugin
this.tools = tools; this.tools = tools;
} }
public IGethStartResult StartGeth(GethStartupConfig gethStartupConfig) public IGethDeployment StartGeth(GethStartupConfig gethStartupConfig)
{ {
Log("Starting Geth bootstrap node..."); Log("Starting Geth bootstrap node...");
@ -38,12 +38,12 @@ namespace GethPlugin
Log($"Geth node started."); Log($"Geth node started.");
return new GethStartResult(container, discoveryPort, httpPort, wsPort, accounts, pubKey); return new GethDeployment(container, discoveryPort, httpPort, wsPort, accounts, pubKey);
} }
public IGethNode WrapGethContainer(IGethStartResult startResult) public IGethNode WrapGethContainer(IGethDeployment startResult)
{ {
return new GethNode(tools.GetLog(), startResult); return new GethNode(tools.GetLog(), SerializeGate.Gate(startResult));
} }
private void Log(string msg) private void Log(string msg)

View File

@ -6,19 +6,19 @@ namespace MetricsPlugin
{ {
public static class CoreInterfaceExtensions public static class CoreInterfaceExtensions
{ {
public static RunningContainer StartMetricsCollector(this CoreInterface ci, params IHasMetricsScrapeTarget[] scrapeTargets) public static RunningContainer DeployMetricsCollector(this CoreInterface ci, params IHasMetricsScrapeTarget[] scrapeTargets)
{ {
return Plugin(ci).StartMetricsCollector(scrapeTargets.Select(t => t.MetricsScrapeTarget).ToArray()); return Plugin(ci).DeployMetricsCollector(scrapeTargets.Select(t => t.MetricsScrapeTarget).ToArray());
} }
public static RunningContainer StartMetricsCollector(this CoreInterface ci, params IMetricsScrapeTarget[] scrapeTargets) public static RunningContainer DeployMetricsCollector(this CoreInterface ci, params IMetricsScrapeTarget[] scrapeTargets)
{ {
return Plugin(ci).StartMetricsCollector(scrapeTargets); return Plugin(ci).DeployMetricsCollector(scrapeTargets);
} }
public static IMetricsAccess GetMetricsFor(this CoreInterface ci, RunningContainer metricsContainer, IMetricsScrapeTarget scrapeTarget) public static IMetricsAccess WrapMetricsCollector(this CoreInterface ci, RunningContainer metricsContainer, IMetricsScrapeTarget scrapeTarget)
{ {
return Plugin(ci).CreateAccessForTarget(metricsContainer, scrapeTarget); return Plugin(ci).WrapMetricsCollectorDeployment(metricsContainer, scrapeTarget);
} }
public static IMetricsAccess[] GetMetricsFor(this CoreInterface ci, params IHasManyMetricScrapeTargets[] manyScrapeTargets) public static IMetricsAccess[] GetMetricsFor(this CoreInterface ci, params IHasManyMetricScrapeTargets[] manyScrapeTargets)
@ -33,8 +33,8 @@ namespace MetricsPlugin
public static IMetricsAccess[] GetMetricsFor(this CoreInterface ci, params IMetricsScrapeTarget[] scrapeTargets) public static IMetricsAccess[] GetMetricsFor(this CoreInterface ci, params IMetricsScrapeTarget[] scrapeTargets)
{ {
var rc = ci.StartMetricsCollector(scrapeTargets); var rc = ci.DeployMetricsCollector(scrapeTargets);
return scrapeTargets.Select(t => ci.GetMetricsFor(rc, t)).ToArray(); return scrapeTargets.Select(t => ci.WrapMetricsCollector(rc, t)).ToArray();
} }
public static LogFile? DownloadAllMetrics(this CoreInterface ci, IMetricsAccess metricsAccess, string targetName) public static LogFile? DownloadAllMetrics(this CoreInterface ci, IMetricsAccess metricsAccess, string targetName)

View File

@ -31,14 +31,14 @@ namespace MetricsPlugin
{ {
} }
public RunningContainer StartMetricsCollector(IMetricsScrapeTarget[] scrapeTargets) public RunningContainer DeployMetricsCollector(IMetricsScrapeTarget[] scrapeTargets)
{ {
return starter.CollectMetricsFor(scrapeTargets); return starter.CollectMetricsFor(scrapeTargets);
} }
public MetricsAccess CreateAccessForTarget(RunningContainer runningContainer, IMetricsScrapeTarget target) public IMetricsAccess WrapMetricsCollectorDeployment(RunningContainer runningContainer, IMetricsScrapeTarget target)
{ {
return starter.CreateAccessForTarget(runningContainer, target); return starter.CreateAccessForTarget(SerializeGate.Gate(runningContainer), target);
} }
public LogFile? DownloadAllMetrics(IMetricsAccess metricsAccess, string targetName) public LogFile? DownloadAllMetrics(IMetricsAccess metricsAccess, string targetName)

View File

@ -52,7 +52,7 @@ namespace Tests.BasicTests
var fileSize = 10.MB(); var fileSize = 10.MB();
var geth = Ci.StartGethNode(s => s.IsMiner().WithName("disttest-geth")); var geth = Ci.StartGethNode(s => s.IsMiner().WithName("disttest-geth"));
var contracts = Ci.DeployCodexContracts(geth); var contracts = Ci.StartCodexContracts(geth);
var seller = AddCodex(s => s var seller = AddCodex(s => s
.WithStorageQuota(11.GB()) .WithStorageQuota(11.GB())