Fixes issue with log downloading in holdmybeer test

This commit is contained in:
benbierens 2023-08-24 09:33:46 +02:00
parent 9a117cca70
commit 561024738a
No known key found for this signature in database
GPG Key ID: FE44815D96D0A1AA
4 changed files with 10 additions and 118 deletions

View File

@ -1,99 +0,0 @@
using DistTestCore;
using DistTestCore.Codex;
using KubernetesWorkflow;
namespace ContinuousTests
{
public class ContinuousLogDownloader
{
private readonly TestLifecycle lifecycle;
private readonly RunningContainer[] containers;
private readonly string outputPath;
private readonly CancellationToken cancelToken;
public ContinuousLogDownloader(TestLifecycle lifecycle, RunningContainer[] containers, string outputPath, CancellationToken cancelToken)
{
this.lifecycle = lifecycle;
this.containers = containers;
this.outputPath = outputPath;
this.cancelToken = cancelToken;
}
public void Run()
{
while (!cancelToken.IsCancellationRequested)
{
UpdateLogs();
cancelToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(15));
}
// After testing has stopped, we wait a little bit and fetch the logs one more time.
// If our latest fetch was not recent, interesting test-related log activity might
// not have been captured yet.
Thread.Sleep(TimeSpan.FromSeconds(10));
UpdateLogs();
}
private void UpdateLogs()
{
foreach (var container in containers)
{
UpdateLog(container);
}
}
private void UpdateLog(RunningContainer container)
{
var filepath = Path.Combine(outputPath, GetLogName(container));
if (!File.Exists(filepath))
{
File.WriteAllLines(filepath, new[] { container.Name });
}
var appender = new LogAppender(filepath);
lifecycle.CodexStarter.DownloadLog(container, appender, null);
}
private static string GetLogName(RunningContainer container)
{
return container.Name
.Replace("<", "")
.Replace(">", "")
+ ".log";
}
}
public class LogAppender : ILogHandler
{
private readonly string filename;
public LogAppender(string filename)
{
this.filename = filename;
}
public void Log(Stream log)
{
using var reader = new StreamReader(log);
var lines = File.ReadAllLines(filename);
var lastLine = lines.Last();
var recording = lines.Length < 3;
var line = reader.ReadLine();
while (line != null)
{
if (recording)
{
File.AppendAllLines(filename, new[] { line });
}
else
{
recording = line == lastLine;
}
line = reader.ReadLine();
}
}
}
}

View File

@ -1,5 +1,7 @@
using DistTestCore; using DistTestCore;
using DistTestCore.Codex; using DistTestCore.Codex;
using DistTestCore.Logs;
using KubernetesWorkflow;
using Logging; using Logging;
namespace ContinuousTests namespace ContinuousTests
@ -87,6 +89,12 @@ namespace ContinuousTests
return file; return file;
} }
public IDownloadedLog DownloadContainerLog(RunningContainer container, int? tailLines = null)
{
var nodeRunner = new NodeRunner(Nodes, Configuration, TimeSet, Log, Configuration.CodexDeployment.Metadata.KubeNamespace, EthereumAccountIndex);
return nodeRunner.DownloadLog(container, tailLines);
}
private void DownloadToFile(CodexAccess node, string contentId, TestFile file) private void DownloadToFile(CodexAccess node, string contentId, TestFile file)
{ {
using var fileStream = File.OpenWrite(file.Filename); using var fileStream = File.OpenWrite(file.Filename);

View File

@ -30,9 +30,6 @@ namespace ContinuousTests
ClearAllCustomNamespaces(allTests, overviewLog); ClearAllCustomNamespaces(allTests, overviewLog);
// Disabled for now. Still looking for a better way.
// StartLogDownloader(taskFactory);
var testLoops = allTests.Select(t => new TestLoop(taskFactory, config, overviewLog, t.GetType(), t.RunTestEvery, cancelToken)).ToArray(); var testLoops = allTests.Select(t => new TestLoop(taskFactory, config, overviewLog, t.GetType(), t.RunTestEvery, cancelToken)).ToArray();
foreach (var testLoop in testLoops) foreach (var testLoop in testLoops)
@ -64,18 +61,5 @@ namespace ContinuousTests
var lifecycle = k8SFactory.CreateTestLifecycle(config.KubeConfigFile, config.LogPath, config.DataPath, test.CustomK8sNamespace, new DefaultTimeSet(), log); var lifecycle = k8SFactory.CreateTestLifecycle(config.KubeConfigFile, config.LogPath, config.DataPath, test.CustomK8sNamespace, new DefaultTimeSet(), log);
lifecycle.WorkflowCreator.CreateWorkflow().DeleteTestResources(); lifecycle.WorkflowCreator.CreateWorkflow().DeleteTestResources();
} }
private void StartLogDownloader(TaskFactory taskFactory)
{
if (!config.DownloadContainerLogs) return;
var path = Path.Combine(config.LogPath, "containers");
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
var lifecycle = k8SFactory.CreateTestLifecycle(config.KubeConfigFile, config.LogPath, config.DataPath, config.CodexDeployment.Metadata.KubeNamespace, new DefaultTimeSet(), new NullLog());
var downloader = new ContinuousLogDownloader(lifecycle, config.CodexDeployment.CodexContainers, path, cancelToken);
taskFactory.Run(downloader.Run);
}
} }
} }

View File

@ -37,7 +37,7 @@ namespace ContinuousTests.Tests
var cidTag = cid!.Id.Substring(cid.Id.Length - 6); var cidTag = cid!.Id.Substring(cid.Id.Length - 6);
Stopwatch.Measure(Log, "upload-log-asserts", () => Stopwatch.Measure(Log, "upload-log-asserts", () =>
{ {
var uploadLog = NodeRunner.DownloadLog(Nodes[0].Container, 50000); var uploadLog = DownloadContainerLog(Nodes[0].Container, 50000);
var storeLines = uploadLog.FindLinesThatContain("Stored data", "topics=\"codex node\""); var storeLines = uploadLog.FindLinesThatContain("Stored data", "topics=\"codex node\"");
uploadLog.DeleteFile(); uploadLog.DeleteFile();
@ -46,13 +46,12 @@ namespace ContinuousTests.Tests
AssertStoreLineContains(storeLine, numberOfBlocks, sizeInBytes); AssertStoreLineContains(storeLine, numberOfBlocks, sizeInBytes);
}); });
var dl = DownloadFile(Nodes[0], cid!); var dl = DownloadFile(Nodes[0], cid!);
file.AssertIsEqual(dl); file.AssertIsEqual(dl);
Stopwatch.Measure(Log, "download-log-asserts", () => Stopwatch.Measure(Log, "download-log-asserts", () =>
{ {
var downloadLog = NodeRunner.DownloadLog(Nodes[0].Container, 50000); var downloadLog = DownloadContainerLog(Nodes[0].Container, 50000);
var sentLines = downloadLog.FindLinesThatContain("Sent bytes", "topics=\"codex restapi\""); var sentLines = downloadLog.FindLinesThatContain("Sent bytes", "topics=\"codex restapi\"");
downloadLog.DeleteFile(); downloadLog.DeleteFile();