using KubernetesWorkflow; namespace DistTestCore.Marketplace { public class GethContainerRecipe : ContainerRecipeFactory { private const string defaultArgs = "--ipcdisable --syncmode full"; public const string HttpPortTag = "http_port"; public const string DiscoveryPortTag = "disc_port"; public const string AccountsFilename = "accounts.csv"; public override string Image { get; } public GethContainerRecipe() { Image = "codexstorage/dist-tests-geth:sha-b788a2d"; } protected override void Initialize(StartupConfig startupConfig) { var config = startupConfig.Get(); var args = CreateArgs(config); AddEnvVar("GETH_ARGS", args); } private string CreateArgs(GethStartupConfig config) { var discovery = AddInternalPort(tag: DiscoveryPortTag); if (config.IsBootstrapNode) { return CreateBootstapArgs(discovery); } return CreateCompanionArgs(discovery, config); } private string CreateBootstapArgs(Port discovery) { AddEnvVar("ENABLE_MINER", "1"); UnlockAccounts(0, 1); var exposedPort = AddExposedPort(tag: HttpPortTag); return $"--http.port {exposedPort.Number} --port {discovery.Number} --discovery.port {discovery.Number} {defaultArgs}"; } private string CreateCompanionArgs(Port discovery, GethStartupConfig config) { UnlockAccounts( config.CompanionAccountStartIndex + 1, config.NumberOfCompanionAccounts); var port = AddInternalPort(); var authRpc = AddInternalPort(); var httpPort = AddExposedPort(tag: HttpPortTag); var bootPubKey = config.BootstrapNode.PubKey; var bootIp = config.BootstrapNode.RunningContainers.Containers[0].Pod.PodInfo.Ip; var bootPort = config.BootstrapNode.DiscoveryPort.Number; var bootstrapArg = $"--bootnodes enode://{bootPubKey}@{bootIp}:{bootPort} --nat=extip:{bootIp}"; return $"--port {port.Number} --discovery.port {discovery.Number} --authrpc.port {authRpc.Number} --http.addr 0.0.0.0 --http.port {httpPort.Number} --ws --ws.addr 0.0.0.0 --ws.port {httpPort.Number} {bootstrapArg} {defaultArgs}"; } private void UnlockAccounts(int startIndex, int numberOfAccounts) { if (startIndex < 0) throw new ArgumentException(); if (numberOfAccounts < 1) throw new ArgumentException(); if (startIndex + numberOfAccounts > 1000) throw new ArgumentException("Out of accounts!"); AddEnvVar("UNLOCK_START_INDEX", startIndex.ToString()); AddEnvVar("UNLOCK_NUMBER", numberOfAccounts.ToString()); } } }