cs-codex-dist-tests/DistTestCore/CodexStarter.cs

159 lines
5.7 KiB
C#
Raw Normal View History

2023-04-12 14:12:04 +00:00
using DistTestCore.Codex;
using DistTestCore.Marketplace;
using DistTestCore.Metrics;
2023-04-12 14:12:04 +00:00
using KubernetesWorkflow;
2023-05-11 10:44:53 +00:00
using Logging;
2023-04-12 14:06:04 +00:00
namespace DistTestCore
{
2023-04-18 11:45:48 +00:00
public class CodexStarter : BaseStarter
2023-04-12 14:06:04 +00:00
{
public CodexStarter(TestLifecycle lifecycle)
: base(lifecycle)
2023-04-12 14:06:04 +00:00
{
}
public List<CodexNodeGroup> RunningGroups { get; } = new List<CodexNodeGroup>();
2023-04-13 07:33:10 +00:00
public ICodexNodeGroup BringOnline(CodexSetup codexSetup)
2023-04-12 14:06:04 +00:00
{
LogSeparator();
2023-04-18 11:45:48 +00:00
LogStart($"Starting {codexSetup.Describe()}...");
2023-04-14 08:51:35 +00:00
var gethStartResult = lifecycle.GethStarter.BringOnlineMarketplaceFor(codexSetup);
var startupConfig = CreateStartupConfig(gethStartResult, codexSetup);
2023-07-31 09:51:29 +00:00
2023-04-14 08:51:35 +00:00
var containers = StartCodexContainers(startupConfig, codexSetup.NumberOfNodes, codexSetup.Location);
var metricAccessFactory = CollectMetrics(codexSetup, containers);
2023-04-12 14:06:04 +00:00
2023-04-14 08:51:35 +00:00
var codexNodeFactory = new CodexNodeFactory(lifecycle, metricAccessFactory, gethStartResult.MarketplaceAccessFactory);
2023-04-12 14:12:04 +00:00
2023-09-14 04:43:47 +00:00
var group = CreateCodexGroup(codexSetup, containers, codexNodeFactory, gethStartResult.CompanionNode.RunningContainer);
2023-07-31 09:51:29 +00:00
lifecycle.SetCodexVersion(group.Version);
var nl = Environment.NewLine;
var podInfos = string.Join(nl, containers.Containers().Select(c => $"Container: '{c.Name}' runs at '{c.Pod.PodInfo.K8SNodeName}'={c.Pod.PodInfo.Ip}"));
2023-07-31 09:51:29 +00:00
LogEnd($"Started {codexSetup.NumberOfNodes} nodes " +
$"of image '{containers.Containers().First().Recipe.Image}' " +
$"and version '{group.Version}'{nl}" +
podInfos);
LogSeparator();
2023-07-31 09:51:29 +00:00
return group;
2023-04-12 14:06:04 +00:00
}
public void BringOffline(CodexNodeGroup group)
2023-04-13 09:07:36 +00:00
{
2023-04-18 11:45:48 +00:00
LogStart($"Stopping {group.Describe()}...");
2023-04-13 09:07:36 +00:00
var workflow = CreateWorkflow();
2023-08-15 09:01:18 +00:00
foreach (var c in group.Containers)
{
StopCrashWatcher(c);
workflow.Stop(c);
}
RunningGroups.Remove(group);
2023-04-18 11:45:48 +00:00
LogEnd("Stopped.");
2023-04-13 09:07:36 +00:00
}
2023-04-12 14:06:04 +00:00
public void DeleteAllResources()
{
2023-04-13 09:07:36 +00:00
var workflow = CreateWorkflow();
2023-05-03 12:18:37 +00:00
workflow.DeleteTestResources();
RunningGroups.Clear();
2023-04-12 14:06:04 +00:00
}
2023-04-13 09:07:36 +00:00
2023-08-16 14:13:29 +00:00
public void DownloadLog(RunningContainer container, ILogHandler logHandler, int? tailLines)
2023-04-13 09:30:19 +00:00
{
var workflow = CreateWorkflow();
2023-08-16 14:13:29 +00:00
workflow.DownloadContainerLog(container, logHandler, tailLines);
2023-04-13 09:30:19 +00:00
}
private IMetricsAccessFactory CollectMetrics(CodexSetup codexSetup, RunningContainers[] containers)
{
2023-08-13 07:07:23 +00:00
if (codexSetup.MetricsMode == MetricsMode.None) return new MetricsUnavailableAccessFactory();
var runningContainers = lifecycle.PrometheusStarter.CollectMetricsFor(containers);
2023-08-13 07:07:23 +00:00
if (codexSetup.MetricsMode == MetricsMode.Dashboard)
{
2023-08-14 08:26:04 +00:00
lifecycle.GrafanaStarter.StartDashboard(runningContainers.Containers.First(), codexSetup);
2023-08-13 07:07:23 +00:00
}
return new CodexNodeMetricsAccessFactory(lifecycle, runningContainers);
}
private StartupConfig CreateStartupConfig(GethStartResult gethStartResult, CodexSetup codexSetup)
{
var startupConfig = new StartupConfig();
startupConfig.NameOverride = codexSetup.NameOverride;
startupConfig.Add(codexSetup);
startupConfig.Add(gethStartResult);
return startupConfig;
}
private RunningContainers[] StartCodexContainers(StartupConfig startupConfig, int numberOfNodes, Location location)
2023-04-13 12:36:17 +00:00
{
var result = new List<RunningContainers>();
var recipe = new CodexContainerRecipe();
for (var i = 0; i < numberOfNodes; i++)
{
var workflow = CreateWorkflow();
2023-08-15 09:01:18 +00:00
var rc = workflow.Start(1, location, recipe, startupConfig);
CreateCrashWatcher(workflow, rc);
result.Add(rc);
}
return result.ToArray();
2023-04-13 12:36:17 +00:00
}
2023-09-14 04:43:47 +00:00
private CodexNodeGroup CreateCodexGroup(CodexSetup codexSetup, RunningContainers[] runningContainers, CodexNodeFactory codexNodeFactory, RunningContainer gethContainer)
2023-04-13 12:36:17 +00:00
{
2023-09-14 04:43:47 +00:00
var group = new CodexNodeGroup(lifecycle, codexSetup, runningContainers, codexNodeFactory, gethContainer);
2023-04-13 12:36:17 +00:00
RunningGroups.Add(group);
try
{
Stopwatch.Measure(lifecycle.Log, "EnsureOnline", group.EnsureOnline, debug: true);
}
catch
{
CodexNodesNotOnline(runningContainers);
throw;
}
2023-04-13 12:36:17 +00:00
return group;
}
2023-04-13 09:30:19 +00:00
private void CodexNodesNotOnline(RunningContainers[] runningContainers)
{
Log("Codex nodes failed to start");
foreach (var container in runningContainers.Containers()) lifecycle.DownloadLog(container);
}
2023-04-13 09:07:36 +00:00
private StartupWorkflow CreateWorkflow()
{
return lifecycle.WorkflowCreator.CreateWorkflow();
2023-04-13 09:07:36 +00:00
}
private void LogSeparator()
{
Log("----------------------------------------------------------------------------");
}
2023-08-15 09:01:18 +00:00
private void CreateCrashWatcher(StartupWorkflow workflow, RunningContainers rc)
{
var c = rc.Containers.Single();
c.CrashWatcher = workflow.CreateCrashWatcher(c);
}
private void StopCrashWatcher(RunningContainers containers)
{
foreach (var c in containers.Containers)
{
c.CrashWatcher?.Stop();
}
}
2023-04-12 14:06:04 +00:00
}
}