Eric 13d453d5ed
chore: Docker updates to support release tests in logos-storage-nim, and remove Codex references (#124)
* ci(docker): build dist-tests images

* Update to .net 10, kubernetes client 18.0.13

Kubernetes client 18.0.13 is compatible with Kubernetes 1.34.x. The Kubernetes version is selected automatically by kubeadm in docker desktop (v1.34.1). See https://github.com/kubernetes-client/csharp#version-compatibility for a compatibility table.

* Updates to support Kubernetes upgrade

* bump openapi.yaml to match openapi.yaml in the logos-storage-nim docker image

* bump doc to .net 10

* bump docker to .net 10

* Build image with latest tag always

Always build an image with a latest tag (as well as a sha commit hash) when there's a push to master

* docker image tag as "latest" only when pushing to master

* Update docker image to install doctl

* Remove doctl install

kubeconfig is now created and uses a plain bearer token instead of using doctl as a credential mgr

* Rename and remove all instances of Codex

* Further remove CodexNetDeployer as it is no longer needed

---------

Co-authored-by: Adam Uhlíř <adam@uhlir.dev>
2026-04-17 15:03:22 +10:00

151 lines
5.1 KiB
C#

using LogosStorageClient;
using LogosStorageTests;
using NUnit.Framework;
using Utils;
namespace ExperimentalTests.DownloadConnectivityTests
{
/// <summary>
/// https://hackmd.io/rwPtPJ7KTw6cGjhN0zNYig
/// </summary>
[TestFixture]
public class DatalayerReliabilityTests : AutoBootstrapDistTest
{
[Test]
[Combinatorial]
public void SingleSetTest(
[Values(1000)] int fileSizeMb,
[Values(10, 20, 30)] int numDownloaders
)
{
var file = GenerateTestFile(fileSizeMb.MB());
var uploader = StartLogosStorage(n => n.WithName("uploader"));
var downloaders = StartLogosStorage(numDownloaders, n => n.WithName("downloader"));
var cid = uploader.UploadFile(file);
var downloadTasks = new List<Task>();
foreach (var dl in downloaders)
{
downloadTasks.Add(Task.Run(() =>
{
dl.DownloadContent(cid);
}));
}
Task.WaitAll(downloadTasks.ToArray());
Assert.That(downloadTasks.All(t => !t.IsFaulted));
}
public class TransferPlan
{
public IStorageNode Uploader { get; set; } = null!;
public ContentId Cid { get; set; } = null!;
public List<DownloaderPlan> Downloaders { get; } = new List<DownloaderPlan>();
}
public class DownloaderPlan
{
public IStorageNode Node { get; set; } = null!;
public List<TransferPlan> TransferPlans { get; } = new List<TransferPlan>();
}
public class AvailableDownloaders
{
private readonly List<DownloaderPlan> all = new List<DownloaderPlan>();
private readonly List<DownloaderPlan> available = new List<DownloaderPlan>();
private readonly int maxUsagePerDownloader;
private readonly int numDownloadersPerPlan;
public AvailableDownloaders(int maxUsagePerDownloader, int numDownloadersPerPlan)
{
this.maxUsagePerDownloader = maxUsagePerDownloader;
this.numDownloadersPerPlan = numDownloadersPerPlan;
}
public void Assign(TransferPlan plan)
{
while (plan.Downloaders.Count < numDownloadersPerPlan)
{
var open = available.Where(a => !plan.Downloaders.Contains(a)).ToArray();
if (!open.Any())
{
var dl = new DownloaderPlan();
all.Add(dl);
available.Add(dl);
}
else
{
var dl = RandomUtils.GetOneRandom(open);
dl.TransferPlans.Add(plan);
plan.Downloaders.Add(dl);
if (dl.TransferPlans.Count == maxUsagePerDownloader) available.Remove(dl);
}
}
}
public DownloaderPlan[] GetAll()
{
return all.ToArray();
}
}
[Test]
[Combinatorial]
public void MultiSetTest(
[Values(1, 3, 5, 10)] int numDatasets,
[Values(1, 10, 100, 1000)] int fileSizeMb,
[Values(5, 10, 20, 30)] int numDownloadersPerDataset,
[Values(3, 5)] int maxDatasetsPerDownloader
)
{
var plans = new List<TransferPlan>();
var uploaders = StartLogosStorage(numDatasets, n => n.WithName("uploader"));
foreach (var n in uploaders)
{
plans.Add(new TransferPlan
{
Uploader = n,
Cid = n.UploadFile(GenerateTestFile(fileSizeMb.MB()))
});
}
Assert.That(plans.Count, Is.GreaterThan(0));
var available = new AvailableDownloaders(maxDatasetsPerDownloader, numDownloadersPerDataset);
foreach (var plan in plans)
{
available.Assign(plan);
}
var allDownloaderPlans = available.GetAll();
Assert.That(allDownloaderPlans.Length, Is.LessThan(100));
Log($"Using {allDownloaderPlans.Length} downloaders...");
var nodes = StartLogosStorage(allDownloaderPlans.Length, n => n.WithName("downloader"));
for (var i = 0; i < allDownloaderPlans.Length; i++)
{
allDownloaderPlans[i].Node = nodes[i];
}
var downloadTasks = new List<Task>();
foreach (var dlPlan in allDownloaderPlans)
{
downloadTasks.Add(Task.Run(() =>
{
var tf = dlPlan.TransferPlans.ToList();
while (tf.Count > 0)
{
var t = tf.PickOneRandom();
dlPlan.Node.DownloadContent(t.Cid);
}
}));
}
Task.WaitAll(downloadTasks.ToArray());
Assert.That(downloadTasks.All(t => !t.IsFaulted));
}
}
}