cs-codex-dist-tests/CodexNetDeployer/Deployer.cs

103 lines
3.9 KiB
C#
Raw Normal View History

2023-06-22 08:17:12 +00:00
using DistTestCore;
2023-06-22 12:37:37 +00:00
using DistTestCore.Codex;
using KubernetesWorkflow;
2023-06-26 13:37:16 +00:00
using Logging;
2023-06-22 08:17:12 +00:00
namespace CodexNetDeployer
{
public class Deployer
{
private readonly Configuration config;
2023-06-22 12:37:37 +00:00
private readonly NullLog log;
private readonly DefaultTimeSet timeset;
2023-06-22 08:17:12 +00:00
public Deployer(Configuration config)
{
this.config = config;
2023-06-22 12:37:37 +00:00
log = new NullLog();
timeset = new DefaultTimeSet();
2023-06-22 08:17:12 +00:00
}
public CodexDeployment Deploy()
2023-06-22 08:33:21 +00:00
{
Log("Initializing...");
2023-06-22 12:37:37 +00:00
var (workflowCreator, lifecycle) = CreateFacilities();
2023-06-22 08:33:21 +00:00
Log("Preparing configuration...");
2023-06-22 12:37:37 +00:00
// We trick the Geth companion node into unlocking all of its accounts, by saying we want to start 999 codex nodes.
var setup = new CodexSetup(999, config.CodexLogLevel);
setup.WithStorageQuota(config.StorageQuota!.Value.MB()).EnableMarketplace(0.TestTokens());
2023-06-22 08:33:21 +00:00
2023-06-22 12:37:37 +00:00
Log("Creating Geth instance and deploying contracts...");
var gethStarter = new GethStarter(lifecycle, workflowCreator);
var gethResults = gethStarter.BringOnlineMarketplaceFor(setup);
2023-06-22 08:33:21 +00:00
2023-06-22 12:37:37 +00:00
Log("Geth started. Codex contracts deployed.");
Log("Warning: It can take up to 45 minutes for the Geth node to finish unlocking all if its 1000 preconfigured accounts.");
2023-06-22 12:37:37 +00:00
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 codexContainers = new List<RunningContainer>();
2023-06-22 12:37:37 +00:00
for (var i = 0; i < config.NumberOfCodexNodes; i++)
2023-06-22 08:33:21 +00:00
{
var container = codexStarter.Start(i);
if (container != null) codexContainers.Add(container);
2023-06-22 08:33:21 +00:00
}
2023-06-23 07:08:18 +00:00
return new CodexDeployment(gethResults, codexContainers.ToArray(), CreateMetadata());
2023-06-22 08:33:21 +00:00
}
2023-06-22 12:37:37 +00:00
private (WorkflowCreator, TestLifecycle) CreateFacilities()
2023-06-22 08:17:12 +00:00
{
2023-06-27 06:29:39 +00:00
var kubeConfig = GetKubeConfig(config.KubeConfigFile);
2023-06-22 08:17:12 +00:00
var lifecycleConfig = new DistTestCore.Configuration
(
2023-06-27 06:29:39 +00:00
kubeConfigFile: kubeConfig,
2023-06-22 08:17:12 +00:00
logPath: "null",
logDebug: false,
dataFilesPath: "notUsed",
2023-06-22 08:33:21 +00:00
codexLogLevel: config.CodexLogLevel,
2023-06-22 08:17:12 +00:00
runnerLocation: config.RunnerLocation
);
2023-06-27 06:29:39 +00:00
var kubeFlowConfig = new KubernetesWorkflow.Configuration(
2023-06-22 08:17:12 +00:00
k8sNamespacePrefix: config.KubeNamespace,
2023-06-27 06:29:39 +00:00
kubeConfigFile: kubeConfig,
2023-06-22 08:17:12 +00:00
operationTimeout: timeset.K8sOperationTimeout(),
retryDelay: timeset.WaitForK8sServiceDelay());
2023-06-27 06:29:39 +00:00
var workflowCreator = new WorkflowCreator(log, kubeFlowConfig, testNamespacePostfix: string.Empty);
2023-06-22 12:37:37 +00:00
var lifecycle = new TestLifecycle(log, lifecycleConfig, timeset, workflowCreator);
return (workflowCreator, lifecycle);
2023-06-22 08:33:21 +00:00
}
2023-06-27 06:29:39 +00:00
private string? GetKubeConfig(string kubeConfigFile)
{
if (string.IsNullOrEmpty(kubeConfigFile) || kubeConfigFile.ToLowerInvariant() == "null") return null;
return kubeConfigFile;
}
2023-06-23 07:08:18 +00:00
private DeploymentMetadata CreateMetadata()
{
return new DeploymentMetadata(
codexImage: config.CodexImage,
gethImage: config.GethImage,
contractsImage: config.ContractsImage,
kubeNamespace: config.KubeNamespace,
numberOfCodexNodes: config.NumberOfCodexNodes!.Value,
numberOfValidators: config.NumberOfValidators!.Value,
storageQuotaMB: config.StorageQuota!.Value,
codexLogLevel: config.CodexLogLevel);
}
2023-06-22 08:33:21 +00:00
private void Log(string msg)
{
Console.WriteLine(msg);
2023-06-22 08:17:12 +00:00
}
}
}