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

106 lines
2.9 KiB
C#

using StoragePlugin.OverwatchSupport;
using Logging;
using OverwatchTranscript;
using TranscriptAnalysis.Receivers;
namespace TranscriptAnalysis
{
public interface IEventReceiver
{
void Init(string sourceFilename, ILog log, OverwatchLogosStorageHeader header);
void Finish();
}
public interface IEventReceiver<T> : IEventReceiver
{
void Receive(ActivateEvent<T> @event);
}
public class ReceiverSet
{
private readonly string sourceFilename;
private readonly ILog log;
private readonly ITranscriptReader reader;
private readonly OverwatchLogosStorageHeader header;
private readonly List<IEventReceiver> receivers = new List<IEventReceiver>();
public ReceiverSet(string sourceFilename, ILog log, ITranscriptReader reader, OverwatchLogosStorageHeader header)
{
this.sourceFilename = sourceFilename;
this.log = log;
this.reader = reader;
this.header = header;
}
public void InitAll()
{
Add(new LogReplaceReceiver());
Add(new DuplicateBlocksReceived());
Add(new NodesDegree());
}
public void FinishAll()
{
foreach (var r in receivers)
{
r.Finish();
}
receivers.Clear();
}
private void Add<T>(IEventReceiver<T> receiver)
{
var mux = GetMux<T>();
mux.Add(receiver);
receivers.Add(receiver);
receiver.Init(sourceFilename, log, header);
}
// We use a mux here because, for each time we call reader.AddEventHandler,
// The reader will perform one separate round of JSON deserialization.
// TODO: Move the mux into the reader.
private readonly Dictionary<string, IEventMux> muxes = new Dictionary<string, IEventMux>();
private IEventMux GetMux<T>()
{
var typeName = typeof(T).FullName;
if (string.IsNullOrEmpty(typeName)) throw new Exception("A!");
if (!muxes.ContainsKey(typeName))
{
muxes.Add(typeName, new EventMux<T>(reader));
}
return muxes[typeName];
}
}
public interface IEventMux
{
void Add(IEventReceiver receiver);
}
public class EventMux<T> : IEventMux
{
private readonly List<IEventReceiver<T>> receivers = new List<IEventReceiver<T>>();
public EventMux(ITranscriptReader reader)
{
reader.AddEventHandler<T>(Handle);
}
public void Add(IEventReceiver receiver)
{
if (receiver is IEventReceiver<T> r)
{
receivers.Add(r);
}
}
public void Handle(ActivateEvent<T> @event)
{
foreach (var r in receivers) r.Receive(@event);
}
}
}