diff --git a/CodexNetDeployer/CodexNodeStarter.cs b/CodexNetDeployer/CodexNodeStarter.cs index ee071db..7c33892 100644 --- a/CodexNetDeployer/CodexNodeStarter.cs +++ b/CodexNetDeployer/CodexNodeStarter.cs @@ -2,7 +2,6 @@ using DistTestCore.Codex; using DistTestCore.Marketplace; using KubernetesWorkflow; -using Logging; namespace CodexNetDeployer { @@ -11,19 +10,15 @@ namespace CodexNetDeployer private readonly Configuration config; private readonly WorkflowCreator workflowCreator; private readonly TestLifecycle lifecycle; - private readonly BaseLog log; - private readonly ITimeSet timeSet; private readonly GethStartResult gethResult; private string bootstrapSpr = ""; private int validatorsLeft; - public CodexNodeStarter(Configuration config, WorkflowCreator workflowCreator, TestLifecycle lifecycle, BaseLog log, ITimeSet timeSet, GethStartResult gethResult, int numberOfValidators) + public CodexNodeStarter(Configuration config, WorkflowCreator workflowCreator, TestLifecycle lifecycle, GethStartResult gethResult, int numberOfValidators) { this.config = config; this.workflowCreator = workflowCreator; this.lifecycle = lifecycle; - this.log = log; - this.timeSet = timeSet; this.gethResult = gethResult; this.validatorsLeft = numberOfValidators; } @@ -39,24 +34,39 @@ namespace CodexNetDeployer var containers = workflow.Start(1, Location.Unspecified, new CodexContainerRecipe(), workflowStartup); var container = containers.Containers.First(); - var address = lifecycle.Configuration.GetAddress(container); - var codexNode = new CodexNode(log, timeSet, address); - var debugInfo = codexNode.GetDebugInfo(); + var codexAccess = new CodexAccess(lifecycle, container); + var account = gethResult.MarketplaceNetwork.Bootstrap.AllAccounts.Accounts[i]; + var tokenAddress = gethResult.MarketplaceNetwork.Marketplace.TokenAddress; + var marketAccess = new MarketplaceAccess(lifecycle, gethResult.MarketplaceNetwork, account, codexAccess); + + var debugInfo = codexAccess.Node.GetDebugInfo(); if (!string.IsNullOrWhiteSpace(debugInfo.spr)) { - var pod = container.Pod.PodInfo; - Console.Write($"Online ({pod.Name} at {pod.Ip} on '{pod.K8SNodeName}')" + Environment.NewLine); + Console.Write("Online\t"); - if (string.IsNullOrEmpty(bootstrapSpr)) bootstrapSpr = debugInfo.spr; - validatorsLeft--; - return container; - } - else - { - Console.Write("Unknown failure." + Environment.NewLine); - return null; + var interaction = gethResult.MarketplaceNetwork.Bootstrap.StartInteraction(lifecycle); + interaction.MintTestTokens(new[] { account.Account }, config.InitialTestTokens, tokenAddress); + Console.Write("Tokens minted\t"); + + var response = marketAccess.MakeStorageAvailable( + totalSpace: (config.StorageQuota!.Value - 1).MB(), + minPriceForTotalSpace: config.MinPrice.TestTokens(), + maxCollateral: config.MaxCollateral.TestTokens(), + maxDuration: TimeSpan.FromSeconds(config.MaxDuration)); + + if (!string.IsNullOrEmpty(response)) + { + Console.Write("Storage available\tOK" + Environment.NewLine); + + if (string.IsNullOrEmpty(bootstrapSpr)) bootstrapSpr = debugInfo.spr; + validatorsLeft--; + return container; + } } + + Console.Write("Unknown failure." + Environment.NewLine); + return null; } private CodexStartupConfig CreateCodexStartupConfig(string bootstrapSpr, int i, int validatorsLeft) diff --git a/CodexNetDeployer/Configuration.cs b/CodexNetDeployer/Configuration.cs index b25e483..d58e233 100644 --- a/CodexNetDeployer/Configuration.cs +++ b/CodexNetDeployer/Configuration.cs @@ -34,6 +34,18 @@ namespace CodexNetDeployer [Uniform("log-level", "l", "LOGLEVEL", true, "Log level used by each Codex node. [Trace, Debug*, Info, Warn, Error]")] public CodexLogLevel CodexLogLevel { get; set; } = CodexLogLevel.Debug; + [Uniform("test-tokens", "tt", "TESTTOKENS", true, "Initial amount of test-tokens minted for each Codex node.")] + public int InitialTestTokens { get; set; } = int.MaxValue; + + [Uniform("min-price", "mp", "MINPRICE", true, "Minimum price for the storage space for which contracts will be accepted.")] + public int MinPrice { get; set; } + + [Uniform("max-collateral", "mc", "MAXCOLLATERAL", true, "Maximum collateral that will be placed for the total storage space.")] + public int MaxCollateral { get; set; } + + [Uniform("max-duration", "md", "MAXDURATION", true, "Maximum duration in seconds for contracts which will be accepted.")] + public int MaxDuration { get; set; } + public TestRunnerLocation RunnerLocation { get; set; } = TestRunnerLocation.InternalToCluster; public List Validate() @@ -59,6 +71,7 @@ namespace CodexNetDeployer { if (p.PropertyType == typeof(string)) onString(p.Name, (string)p.GetValue(this)!); if (p.PropertyType == typeof(int?)) onInt(p.Name, (int?)p.GetValue(this)!); + if (p.PropertyType == typeof(int)) onInt(p.Name, (int)p.GetValue(this)!); } } diff --git a/CodexNetDeployer/Deployer.cs b/CodexNetDeployer/Deployer.cs index ba0ecc5..b4efd3f 100644 --- a/CodexNetDeployer/Deployer.cs +++ b/CodexNetDeployer/Deployer.cs @@ -38,7 +38,7 @@ namespace CodexNetDeployer Log("Starting Codex nodes..."); // Each node must have its own IP, so it needs it own pod. Start them 1 at a time. - var codexStarter = new CodexNodeStarter(config, workflowCreator, lifecycle, log, timeset, gethResults, config.NumberOfValidators!.Value); + var codexStarter = new CodexNodeStarter(config, workflowCreator, lifecycle, gethResults, config.NumberOfValidators!.Value); var codexContainers = new List(); for (var i = 0; i < config.NumberOfCodexNodes; i++) { @@ -91,7 +91,11 @@ namespace CodexNetDeployer numberOfCodexNodes: config.NumberOfCodexNodes!.Value, numberOfValidators: config.NumberOfValidators!.Value, storageQuotaMB: config.StorageQuota!.Value, - codexLogLevel: config.CodexLogLevel); + codexLogLevel: config.CodexLogLevel, + initialTestTokens: config.InitialTestTokens, + minPrice: config.MinPrice, + maxCollateral: config.MaxCollateral, + maxDuration: config.MaxDuration); } private void Log(string msg) diff --git a/DistTestCore/Codex/CodexDeployment.cs b/DistTestCore/Codex/CodexDeployment.cs index cc4246e..37db831 100644 --- a/DistTestCore/Codex/CodexDeployment.cs +++ b/DistTestCore/Codex/CodexDeployment.cs @@ -19,7 +19,7 @@ namespace DistTestCore.Codex public class DeploymentMetadata { - public DeploymentMetadata(string codexImage, string gethImage, string contractsImage, string kubeNamespace, int numberOfCodexNodes, int numberOfValidators, int storageQuotaMB, CodexLogLevel codexLogLevel) + public DeploymentMetadata(string codexImage, string gethImage, string contractsImage, string kubeNamespace, int numberOfCodexNodes, int numberOfValidators, int storageQuotaMB, CodexLogLevel codexLogLevel, int initialTestTokens, int minPrice, int maxCollateral, int maxDuration) { DeployDateTimeUtc = DateTime.UtcNow; CodexImage = codexImage; @@ -30,8 +30,12 @@ namespace DistTestCore.Codex NumberOfValidators = numberOfValidators; StorageQuotaMB = storageQuotaMB; CodexLogLevel = codexLogLevel; + InitialTestTokens = initialTestTokens; + MinPrice = minPrice; + MaxCollateral = maxCollateral; + MaxDuration = maxDuration; } - + public string CodexImage { get; } public DateTime DeployDateTimeUtc { get; } public string GethImage { get; } @@ -41,5 +45,9 @@ namespace DistTestCore.Codex public int NumberOfValidators { get; } public int StorageQuotaMB { get; } public CodexLogLevel CodexLogLevel { get; } + public int InitialTestTokens { get; } + public int MinPrice { get; } + public int MaxCollateral { get; } + public int MaxDuration { get; } } } diff --git a/DistTestCore/Marketplace/MarketplaceAccess.cs b/DistTestCore/Marketplace/MarketplaceAccess.cs index f64e271..858717d 100644 --- a/DistTestCore/Marketplace/MarketplaceAccess.cs +++ b/DistTestCore/Marketplace/MarketplaceAccess.cs @@ -62,19 +62,19 @@ namespace DistTestCore.Marketplace return response; } - public string MakeStorageAvailable(ByteSize size, TestToken minPricePerBytePerSecond, TestToken maxCollateral, TimeSpan maxDuration) + public string MakeStorageAvailable(ByteSize totalSpace, TestToken minPriceForTotalSpace, TestToken maxCollateral, TimeSpan maxDuration) { var request = new CodexSalesAvailabilityRequest { - size = ToHexBigInt(size.SizeInBytes), + size = ToHexBigInt(totalSpace.SizeInBytes), duration = ToHexBigInt(maxDuration.TotalSeconds), maxCollateral = ToHexBigInt(maxCollateral), - minPrice = ToHexBigInt(minPricePerBytePerSecond) + minPrice = ToHexBigInt(minPriceForTotalSpace) }; Log($"Making storage available... (" + - $"size: {size}, " + - $"minPricePerBytePerSecond: {minPricePerBytePerSecond}, " + + $"size: {totalSpace}, " + + $"minPricePerBytePerSecond: {minPriceForTotalSpace}, " + $"maxCollateral: {maxCollateral}, " + $"maxDuration: {Time.FormatDuration(maxDuration)})");