From 5f9371e95e8f35e9bf815dfda9a96237b7a48640 Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:02:53 +1000 Subject: [PATCH 1/6] Add validator and simulation of proof failures --- DistTestCore/Codex/CodexContainerRecipe.cs | 35 +++++++++++++++++----- DistTestCore/Codex/CodexStartupConfig.cs | 4 ++- DistTestCore/CodexSetup.cs | 28 +++++++++++++++-- DistTestCore/CodexStarter.cs | 1 + DistTestCore/GethStarter.cs | 11 +++++++ 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/DistTestCore/Codex/CodexContainerRecipe.cs b/DistTestCore/Codex/CodexContainerRecipe.cs index c928b3e..d6e3e41 100644 --- a/DistTestCore/Codex/CodexContainerRecipe.cs +++ b/DistTestCore/Codex/CodexContainerRecipe.cs @@ -6,8 +6,7 @@ namespace DistTestCore.Codex { public class CodexContainerRecipe : DefaultContainerRecipe { - private const string DefaultDockerImage = "codexstorage/nim-codex:latest-dist-tests"; - + public const string DockerImage = "codexstorage/nim-codex:sha-1d161d3"; public const string MetricsPortTag = "metrics_port"; public const string DiscoveryPortTag = "discovery-port"; @@ -38,7 +37,12 @@ namespace DistTestCore.Codex AddVolume($"codex/{dataDir}", GetVolumeCapacity(config)); AddInternalPortAndVar("CODEX_DISC_PORT", DiscoveryPortTag); - AddEnvVar("CODEX_LOG_LEVEL", config.LogLevel.ToString()!.ToUpperInvariant()); + + var level = config.LogLevel.ToString()!.ToUpperInvariant(); + if (config.LogTopics != null && config.LogTopics.Count() > 0){ + level = $"INFO;{level}: {string.Join(",", config.LogTopics.Where(s => !string.IsNullOrEmpty(s)))}"; + } + AddEnvVar("CODEX_LOG_LEVEL", level); // This makes the node announce itself to its local (pod) IP address. AddEnvVar("NAT_IP_AUTO", "true"); @@ -76,7 +80,15 @@ namespace DistTestCore.Codex AddPodAnnotation("prometheus.io/port", metricsPort.Number.ToString()); } - if (config.MarketplaceConfig != null) + if (config.SimulateProofFailures != null) + { + AddEnvVar("CODEX_SIMULATE_PROOF_FAILURES", config.SimulateProofFailures.ToString()!); + } + if (config.EnableValidator == true) + { + AddEnvVar("CODEX_VALIDATOR", "true"); + } + if (config.MarketplaceConfig != null || config.EnableValidator == true) { var gethConfig = startupConfig.Get(); var companionNode = gethConfig.CompanionNode; @@ -91,10 +103,17 @@ namespace DistTestCore.Codex AddEnvVar("CODEX_MARKETPLACE_ADDRESS", gethConfig.MarketplaceNetwork.Marketplace.Address); AddEnvVar("CODEX_PERSISTENCE", "true"); - if (config.MarketplaceConfig.IsValidator) - { - AddEnvVar("CODEX_VALIDATOR", "true"); - } + //if (config.MarketplaceConfig.IsValidator) + //{ + // AddEnvVar("CODEX_VALIDATOR", "true"); + //} + } + if (config.MarketplaceConfig != null) { + AddEnvVar("CODEX_PERSISTENCE", "true"); + } + + if(!string.IsNullOrEmpty(config.NameOverride)) { + AddEnvVar("CODEX_NODENAME", config.NameOverride); } } diff --git a/DistTestCore/Codex/CodexStartupConfig.cs b/DistTestCore/Codex/CodexStartupConfig.cs index 36e4757..a1170c6 100644 --- a/DistTestCore/Codex/CodexStartupConfig.cs +++ b/DistTestCore/Codex/CodexStartupConfig.cs @@ -14,12 +14,14 @@ namespace DistTestCore.Codex public string? NameOverride { get; set; } public Location Location { get; set; } - public CodexLogLevel LogLevel { get; } + public CodexLogLevel LogLevel { get; set; } public ByteSize? StorageQuota { get; set; } public MetricsMode MetricsMode { get; set; } public MarketplaceInitialConfig? MarketplaceConfig { get; set; } public string? BootstrapSpr { get; set; } public int? BlockTTL { get; set; } + public uint? SimulateProofFailures { get; set; } + public bool? EnableValidator { get; set; } public TimeSpan? BlockMaintenanceInterval { get; set; } public int? BlockMaintenanceNumber { get; set; } } diff --git a/DistTestCore/CodexSetup.cs b/DistTestCore/CodexSetup.cs index f2ec51e..c91b66f 100644 --- a/DistTestCore/CodexSetup.cs +++ b/DistTestCore/CodexSetup.cs @@ -18,8 +18,16 @@ namespace DistTestCore ICodexSetup EnableMarketplace(TestToken initialBalance); ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther); ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther, bool isValidator); + /// + /// Provides an invalid proof every N proofs + /// + ICodexSetup WithSimulateProofFailures(uint failEveryNProofs); + /// + /// Enables the validation module in the node + /// + ICodexSetup WithValidator(); } - + public class CodexSetup : CodexStartupConfig, ICodexSetup { public int NumberOfNodes { get; } @@ -85,7 +93,7 @@ namespace DistTestCore public ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther) { - return EnableMarketplace(initialBalance, initialEther, false); + return EnableMarketplace(initialBalance, initialEther, false); } public ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther, bool isValidator) @@ -94,6 +102,18 @@ namespace DistTestCore return this; } + public ICodexSetup WithSimulateProofFailures(uint failEveryNProofs) + { + SimulateProofFailures = failEveryNProofs; + return this; + } + + public ICodexSetup WithValidator() + { + EnableValidator = true; + return this; + } + public string Describe() { var args = string.Join(',', DescribeArgs()); @@ -104,7 +124,9 @@ namespace DistTestCore { yield return $"LogLevel={LogLevel}"; if (BootstrapSpr != null) yield return $"BootstrapNode={BootstrapSpr}"; - if (StorageQuota != null) yield return $"StorageQuote={StorageQuota}"; + if (StorageQuota != null) yield return $"StorageQuota={StorageQuota}"; + if (SimulateProofFailures != null) yield return $"SimulateProofFailures={SimulateProofFailures}"; + if (EnableValidator != null) yield return $"EnableValidator={EnableValidator}"; } } } diff --git a/DistTestCore/CodexStarter.cs b/DistTestCore/CodexStarter.cs index 86a839e..7a8947b 100644 --- a/DistTestCore/CodexStarter.cs +++ b/DistTestCore/CodexStarter.cs @@ -20,6 +20,7 @@ namespace DistTestCore LogSeparator(); LogStart($"Starting {codexSetup.Describe()}..."); var gethStartResult = lifecycle.GethStarter.BringOnlineMarketplaceFor(codexSetup); + gethStartResult = lifecycle.GethStarter.BringOnlineValidatorFor(codexSetup, gethStartResult); var startupConfig = CreateStartupConfig(gethStartResult, codexSetup); diff --git a/DistTestCore/GethStarter.cs b/DistTestCore/GethStarter.cs index 578cc30..7df4ba4 100644 --- a/DistTestCore/GethStarter.cs +++ b/DistTestCore/GethStarter.cs @@ -30,6 +30,17 @@ namespace DistTestCore return CreateGethStartResult(marketplaceNetwork, companionNode); } + public GethStartResult BringOnlineValidatorFor(CodexSetup codexSetup, GethStartResult previousResult) + { + // allow marketplace and validator to be enabled on the same Codex node + if (previousResult.CompanionNode != null || (codexSetup.EnableValidator ?? false) == false) return previousResult; + + var marketplaceNetwork = marketplaceNetworkCache.Get(); + var companionNode = StartCompanionNode(codexSetup, marketplaceNetwork); + + return CreateGethStartResult(marketplaceNetwork, companionNode); + } + private void TransferInitialBalance(MarketplaceNetwork marketplaceNetwork, MarketplaceInitialConfig marketplaceConfig, GethCompanionNodeInfo companionNode) { if (marketplaceConfig.InitialTestTokens.Amount == 0) return; From f765933efa410f73999cb045352b5f0f0fe1c44c Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:03:09 +1000 Subject: [PATCH 2/6] update WithLogLevel to accept params string[] --- DistTestCore/Codex/CodexStartupConfig.cs | 1 + DistTestCore/CodexSetup.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/DistTestCore/Codex/CodexStartupConfig.cs b/DistTestCore/Codex/CodexStartupConfig.cs index a1170c6..f02dca7 100644 --- a/DistTestCore/Codex/CodexStartupConfig.cs +++ b/DistTestCore/Codex/CodexStartupConfig.cs @@ -15,6 +15,7 @@ namespace DistTestCore.Codex public string? NameOverride { get; set; } public Location Location { get; set; } public CodexLogLevel LogLevel { get; set; } + public string[]? LogTopics { get; set; } public ByteSize? StorageQuota { get; set; } public MetricsMode MetricsMode { get; set; } public MarketplaceInitialConfig? MarketplaceConfig { get; set; } diff --git a/DistTestCore/CodexSetup.cs b/DistTestCore/CodexSetup.cs index c91b66f..3dbc1d0 100644 --- a/DistTestCore/CodexSetup.cs +++ b/DistTestCore/CodexSetup.cs @@ -9,6 +9,12 @@ namespace DistTestCore { ICodexSetup WithName(string name); ICodexSetup At(Location location); + ICodexSetup WithLogLevel(CodexLogLevel level); + /// + /// Sets the log level for codex. The default level is INFO and the + /// log level is applied only to the supplied topics. + /// + ICodexSetup WithLogLevel(CodexLogLevel level, params string[] topics); ICodexSetup WithBootstrapNode(IOnlineCodexNode node); ICodexSetup WithStorageQuota(ByteSize storageQuota); ICodexSetup WithBlockTTL(TimeSpan duration); @@ -56,6 +62,19 @@ namespace DistTestCore return this; } + public ICodexSetup WithLogLevel(CodexLogLevel level) + { + LogLevel = level; + return this; + } + + public ICodexSetup WithLogLevel(CodexLogLevel level, params string[] topics) + { + LogLevel = level; + LogTopics = topics; + return this; + } + public ICodexSetup WithStorageQuota(ByteSize storageQuota) { StorageQuota = storageQuota; From 52b907e52e32527033eb1982c6d498efb3eb3550 Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:04:37 +1000 Subject: [PATCH 3/6] Add LogLevelWithTopics, Get simulate proof failures test running --- DistTestCore/Codex/CodexContainerRecipe.cs | 33 ++++++++----------- DistTestCore/Codex/CodexStartupConfig.cs | 10 ++++++ DistTestCore/CodexSetup.cs | 16 ++++----- DistTestCore/DistTestCore.csproj | 4 --- .../CodexContractsContainerRecipe.cs | 1 + 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/DistTestCore/Codex/CodexContainerRecipe.cs b/DistTestCore/Codex/CodexContainerRecipe.cs index d6e3e41..08cca75 100644 --- a/DistTestCore/Codex/CodexContainerRecipe.cs +++ b/DistTestCore/Codex/CodexContainerRecipe.cs @@ -6,7 +6,7 @@ namespace DistTestCore.Codex { public class CodexContainerRecipe : DefaultContainerRecipe { - public const string DockerImage = "codexstorage/nim-codex:sha-1d161d3"; + public const string DockerImage = "codexstorage/nim-codex:sha-dd67b74"; public const string MetricsPortTag = "metrics_port"; public const string DiscoveryPortTag = "discovery-port"; @@ -37,12 +37,7 @@ namespace DistTestCore.Codex AddVolume($"codex/{dataDir}", GetVolumeCapacity(config)); AddInternalPortAndVar("CODEX_DISC_PORT", DiscoveryPortTag); - - var level = config.LogLevel.ToString()!.ToUpperInvariant(); - if (config.LogTopics != null && config.LogTopics.Count() > 0){ - level = $"INFO;{level}: {string.Join(",", config.LogTopics.Where(s => !string.IsNullOrEmpty(s)))}"; - } - AddEnvVar("CODEX_LOG_LEVEL", level); + AddEnvVar("CODEX_LOG_LEVEL", config.LogLevelWithTopics()); // This makes the node announce itself to its local (pod) IP address. AddEnvVar("NAT_IP_AUTO", "true"); @@ -84,11 +79,11 @@ namespace DistTestCore.Codex { AddEnvVar("CODEX_SIMULATE_PROOF_FAILURES", config.SimulateProofFailures.ToString()!); } - if (config.EnableValidator == true) - { - AddEnvVar("CODEX_VALIDATOR", "true"); - } - if (config.MarketplaceConfig != null || config.EnableValidator == true) + // if (config.EnableValidator == true) + // { + // AddEnvVar("CODEX_VALIDATOR", "true"); + // } + if (config.MarketplaceConfig != null) { var gethConfig = startupConfig.Get(); var companionNode = gethConfig.CompanionNode; @@ -103,14 +98,14 @@ namespace DistTestCore.Codex AddEnvVar("CODEX_MARKETPLACE_ADDRESS", gethConfig.MarketplaceNetwork.Marketplace.Address); AddEnvVar("CODEX_PERSISTENCE", "true"); - //if (config.MarketplaceConfig.IsValidator) - //{ - // AddEnvVar("CODEX_VALIDATOR", "true"); - //} - } - if (config.MarketplaceConfig != null) { - AddEnvVar("CODEX_PERSISTENCE", "true"); + if (config.MarketplaceConfig.IsValidator) + { + AddEnvVar("CODEX_VALIDATOR", "true"); + } } + // if (config.MarketplaceConfig != null) { + // AddEnvVar("CODEX_PERSISTENCE", "true"); + // } if(!string.IsNullOrEmpty(config.NameOverride)) { AddEnvVar("CODEX_NODENAME", config.NameOverride); diff --git a/DistTestCore/Codex/CodexStartupConfig.cs b/DistTestCore/Codex/CodexStartupConfig.cs index f02dca7..0ca738d 100644 --- a/DistTestCore/Codex/CodexStartupConfig.cs +++ b/DistTestCore/Codex/CodexStartupConfig.cs @@ -12,6 +12,16 @@ namespace DistTestCore.Codex LogLevel = logLevel; } + public string LogLevelWithTopics() + { + var level = LogLevel.ToString()!.ToUpperInvariant(); + if (LogTopics != null && LogTopics.Count() > 0) + { + level = $"INFO;{level}: {string.Join(",", LogTopics.Where(s => !string.IsNullOrEmpty(s)))}"; + } + return level; + } + public string? NameOverride { get; set; } public Location Location { get; set; } public CodexLogLevel LogLevel { get; set; } diff --git a/DistTestCore/CodexSetup.cs b/DistTestCore/CodexSetup.cs index 3dbc1d0..83dc11c 100644 --- a/DistTestCore/CodexSetup.cs +++ b/DistTestCore/CodexSetup.cs @@ -31,7 +31,7 @@ namespace DistTestCore /// /// Enables the validation module in the node /// - ICodexSetup WithValidator(); + // ICodexSetup WithValidator(); } public class CodexSetup : CodexStartupConfig, ICodexSetup @@ -127,11 +127,11 @@ namespace DistTestCore return this; } - public ICodexSetup WithValidator() - { - EnableValidator = true; - return this; - } + // public ICodexSetup WithValidator() + // { + // EnableValidator = true; + // return this; + // } public string Describe() { @@ -141,11 +141,11 @@ namespace DistTestCore private IEnumerable DescribeArgs() { - yield return $"LogLevel={LogLevel}"; + 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 (EnableValidator != null) yield return $"EnableValidator={EnableValidator}"; + if (MarketplaceConfig != null) yield return $"IsValidator={MarketplaceConfig.IsValidator}"; } } } diff --git a/DistTestCore/DistTestCore.csproj b/DistTestCore/DistTestCore.csproj index 94a2271..89d4b1f 100644 --- a/DistTestCore/DistTestCore.csproj +++ b/DistTestCore/DistTestCore.csproj @@ -5,10 +5,6 @@ DistTestCore enable enable - true - - - Arm64 diff --git a/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs b/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs index bd2c906..8de0bc7 100644 --- a/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs +++ b/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs @@ -4,6 +4,7 @@ namespace DistTestCore.Marketplace { public class CodexContractsContainerRecipe : DefaultContainerRecipe { + public const string DockerImage = "codexstorage/dist-tests-codex-contracts-eth:sha-b4e4897"; public const string MarketplaceAddressFilename = "/hardhat/deployments/codexdisttestnetwork/Marketplace.json"; public const string MarketplaceArtifactFilename = "/hardhat/artifacts/contracts/Marketplace.sol/Marketplace.json"; From fd012196f87610fbfd2347d5437f9bb61406b137 Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:11:04 +1000 Subject: [PATCH 4/6] cleanup --- DistTestCore/Codex/CodexContainerRecipe.cs | 8 +------- DistTestCore/CodexSetup.cs | 12 +----------- .../Marketplace/CodexContractsContainerRecipe.cs | 1 - 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/DistTestCore/Codex/CodexContainerRecipe.cs b/DistTestCore/Codex/CodexContainerRecipe.cs index 08cca75..4d3570e 100644 --- a/DistTestCore/Codex/CodexContainerRecipe.cs +++ b/DistTestCore/Codex/CodexContainerRecipe.cs @@ -79,10 +79,7 @@ namespace DistTestCore.Codex { AddEnvVar("CODEX_SIMULATE_PROOF_FAILURES", config.SimulateProofFailures.ToString()!); } - // if (config.EnableValidator == true) - // { - // AddEnvVar("CODEX_VALIDATOR", "true"); - // } + if (config.MarketplaceConfig != null) { var gethConfig = startupConfig.Get(); @@ -103,9 +100,6 @@ namespace DistTestCore.Codex AddEnvVar("CODEX_VALIDATOR", "true"); } } - // if (config.MarketplaceConfig != null) { - // AddEnvVar("CODEX_PERSISTENCE", "true"); - // } if(!string.IsNullOrEmpty(config.NameOverride)) { AddEnvVar("CODEX_NODENAME", config.NameOverride); diff --git a/DistTestCore/CodexSetup.cs b/DistTestCore/CodexSetup.cs index 83dc11c..3e7bd8c 100644 --- a/DistTestCore/CodexSetup.cs +++ b/DistTestCore/CodexSetup.cs @@ -28,10 +28,6 @@ namespace DistTestCore /// Provides an invalid proof every N proofs /// ICodexSetup WithSimulateProofFailures(uint failEveryNProofs); - /// - /// Enables the validation module in the node - /// - // ICodexSetup WithValidator(); } public class CodexSetup : CodexStartupConfig, ICodexSetup @@ -112,7 +108,7 @@ namespace DistTestCore public ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther) { - return EnableMarketplace(initialBalance, initialEther, false); + return EnableMarketplace(initialBalance, initialEther, false); } public ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther, bool isValidator) @@ -127,12 +123,6 @@ namespace DistTestCore return this; } - // public ICodexSetup WithValidator() - // { - // EnableValidator = true; - // return this; - // } - public string Describe() { var args = string.Join(',', DescribeArgs()); diff --git a/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs b/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs index 8de0bc7..bd2c906 100644 --- a/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs +++ b/DistTestCore/Marketplace/CodexContractsContainerRecipe.cs @@ -4,7 +4,6 @@ namespace DistTestCore.Marketplace { public class CodexContractsContainerRecipe : DefaultContainerRecipe { - public const string DockerImage = "codexstorage/dist-tests-codex-contracts-eth:sha-b4e4897"; public const string MarketplaceAddressFilename = "/hardhat/deployments/codexdisttestnetwork/Marketplace.json"; public const string MarketplaceArtifactFilename = "/hardhat/artifacts/contracts/Marketplace.sol/Marketplace.json"; From 5dbaaaee0f8ca1fa8d939766d1fb5445254e6e43 Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:17:30 +1000 Subject: [PATCH 5/6] replace tab chars with spaces --- DistTestCore/Codex/CodexContainerRecipe.cs | 4 ++-- DistTestCore/CodexSetup.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DistTestCore/Codex/CodexContainerRecipe.cs b/DistTestCore/Codex/CodexContainerRecipe.cs index 4d3570e..fb38195 100644 --- a/DistTestCore/Codex/CodexContainerRecipe.cs +++ b/DistTestCore/Codex/CodexContainerRecipe.cs @@ -16,7 +16,7 @@ namespace DistTestCore.Codex public override string AppName => "codex"; public override string Image { get; } - + public CodexContainerRecipe() { Image = GetDockerImage(); @@ -75,7 +75,7 @@ namespace DistTestCore.Codex AddPodAnnotation("prometheus.io/port", metricsPort.Number.ToString()); } - if (config.SimulateProofFailures != null) + if (config.SimulateProofFailures != null) { AddEnvVar("CODEX_SIMULATE_PROOF_FAILURES", config.SimulateProofFailures.ToString()!); } diff --git a/DistTestCore/CodexSetup.cs b/DistTestCore/CodexSetup.cs index 3e7bd8c..e421aa9 100644 --- a/DistTestCore/CodexSetup.cs +++ b/DistTestCore/CodexSetup.cs @@ -24,7 +24,7 @@ namespace DistTestCore ICodexSetup EnableMarketplace(TestToken initialBalance); ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther); ICodexSetup EnableMarketplace(TestToken initialBalance, Ether initialEther, bool isValidator); - /// + /// /// Provides an invalid proof every N proofs /// ICodexSetup WithSimulateProofFailures(uint failEveryNProofs); From d412665f9725aaf94c4bf0ff47d6fdc78899747f Mon Sep 17 00:00:00 2001 From: Eric <5089238+emizzle@users.noreply.github.com> Date: Thu, 14 Sep 2023 15:18:11 +1000 Subject: [PATCH 6/6] revert change to codex image --- DistTestCore/Codex/CodexContainerRecipe.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DistTestCore/Codex/CodexContainerRecipe.cs b/DistTestCore/Codex/CodexContainerRecipe.cs index fb38195..9dcfb32 100644 --- a/DistTestCore/Codex/CodexContainerRecipe.cs +++ b/DistTestCore/Codex/CodexContainerRecipe.cs @@ -6,7 +6,7 @@ namespace DistTestCore.Codex { public class CodexContainerRecipe : DefaultContainerRecipe { - public const string DockerImage = "codexstorage/nim-codex:sha-dd67b74"; + private const string DefaultDockerImage = "codexstorage/nim-codex:latest-dist-tests"; public const string MetricsPortTag = "metrics_port"; public const string DiscoveryPortTag = "discovery-port";