128 lines
5.0 KiB
C#
Raw Normal View History

using KubernetesWorkflow;
using KubernetesWorkflow.Recipe;
2023-09-08 09:39:56 +02:00
using Utils;
2023-04-12 13:53:55 +02:00
namespace CodexPlugin
2023-04-12 13:53:55 +02:00
{
2023-09-13 16:06:05 +02:00
public class CodexContainerRecipe : ContainerRecipeFactory
2023-04-12 13:53:55 +02:00
{
2023-10-19 11:12:08 +02:00
public const string ApiPortTag = "codex_api_port";
public const string ListenPortTag = "codex_listen_port";
public const string MetricsPortTag = "codex_metrics_port";
public const string DiscoveryPortTag = "codex_discovery_port";
2023-04-13 14:36:17 +02:00
// Used by tests for time-constraint assertions.
public static readonly TimeSpan MaxUploadTimePerMegabyte = TimeSpan.FromSeconds(2.0);
public static readonly TimeSpan MaxDownloadTimePerMegabyte = TimeSpan.FromSeconds(2.0);
private readonly CodexDockerImage codexDockerImage;
2023-08-07 15:51:44 +02:00
public override string AppName => "codex";
public override string Image => codexDockerImage.GetCodexDockerImage();
2023-09-14 15:17:30 +10:00
public CodexContainerRecipe(CodexDockerImage codexDockerImage)
{
this.codexDockerImage = codexDockerImage;
}
2023-04-12 13:53:55 +02:00
2023-09-13 16:06:05 +02:00
protected override void Initialize(StartupConfig startupConfig)
2023-04-12 13:53:55 +02:00
{
SetResourcesRequest(milliCPUs: 100, memory: 100.MB());
2023-11-07 09:25:51 +01:00
//SetResourceLimits(milliCPUs: 4000, memory: 12.GB());
SetSchedulingAffinity(notIn: "false");
SetSystemCriticalPriority();
2023-04-12 13:53:55 +02:00
var config = startupConfig.Get<CodexStartupConfig>();
var apiPort = CreateApiPort(config, ApiPortTag);
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_API_PORT", apiPort);
AddEnvVar("STORAGE_API_BINDADDR", "0.0.0.0");
2023-07-04 16:04:18 +02:00
var dataDir = $"datadir{ContainerNumber}";
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_DATA_DIR", dataDir);
AddVolume($"codex/{dataDir}", GetVolumeCapacity(config));
var discPort = CreateDiscoveryPort(config);
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_DISC_PORT", discPort);
AddEnvVar("STORAGE_LOG_LEVEL", config.LogLevelWithTopics());
2023-07-04 16:04:18 +02:00
if (config.PublicTestNet != null)
{
// This makes the node announce itself to its public IP address.
2023-10-27 11:21:43 +02:00
AddEnvVar("NAT_IP_AUTO", "false");
2023-12-11 08:38:31 +01:00
AddEnvVar("NAT_PUBLIC_IP_AUTO", PublicIpService.Address);
}
else
{
// This makes the node announce itself to its local (pod) IP address.
AddEnvVar("NAT_IP_AUTO", "true");
}
2023-04-12 13:53:55 +02:00
var listenPort = CreateListenPort(config);
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_LISTEN_ADDRS", $"/ip4/0.0.0.0/tcp/{listenPort.Number}");
2023-04-12 13:53:55 +02:00
if (!string.IsNullOrEmpty(config.BootstrapSpr))
{
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_BOOTSTRAP_NODE", config.BootstrapSpr);
}
2023-04-12 13:53:55 +02:00
if (config.StorageQuota != null)
{
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_STORAGE_QUOTA", config.StorageQuota.SizeInBytes.ToString()!);
2023-04-12 13:53:55 +02:00
}
if (config.BlockTTL != null)
{
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_BLOCK_TTL", config.BlockTTL.ToString()!);
}
if (config.BlockMaintenanceInterval != null)
{
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_BLOCK_MI", Convert.ToInt32(config.BlockMaintenanceInterval.Value.TotalSeconds).ToString());
}
if (config.BlockMaintenanceNumber != null)
{
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_BLOCK_MN", config.BlockMaintenanceNumber.ToString()!);
}
2023-09-13 11:59:21 +02:00
if (config.MetricsEnabled)
{
var metricsPort = CreateApiPort(config, MetricsPortTag);
2026-02-11 10:18:06 +01:00
AddEnvVar("STORAGE_METRICS", "true");
AddEnvVar("STORAGE_METRICS_ADDRESS", "0.0.0.0");
AddEnvVar("STORAGE_METRICS_PORT", metricsPort);
2023-09-13 11:59:21 +02:00
AddPodAnnotation("prometheus.io/scrape", "true");
AddPodAnnotation("prometheus.io/port", metricsPort.Number.ToString());
}
if (!string.IsNullOrEmpty(config.NameOverride))
{
AddEnvVar("CODEX_NODENAME", config.NameOverride);
2023-04-14 10:51:35 +02:00
}
2023-04-12 13:53:55 +02:00
}
2026-02-11 10:18:06 +01:00
private Port CreateApiPort(CodexStartupConfig config, string tag)
{
if (config.PublicTestNet == null) return AddExposedPort(tag);
return AddInternalPort(tag);
}
private Port CreateListenPort(CodexStartupConfig config)
{
if (config.PublicTestNet == null) return AddInternalPort(ListenPortTag);
return AddExposedPort(config.PublicTestNet.PublicListenPort, ListenPortTag);
}
private Port CreateDiscoveryPort(CodexStartupConfig config)
{
if (config.PublicTestNet == null) return AddInternalPort(DiscoveryPortTag, PortProtocol.UDP);
return AddExposedPort(config.PublicTestNet.PublicDiscoveryPort, DiscoveryPortTag, PortProtocol.UDP);
}
2023-09-08 09:39:56 +02:00
private ByteSize GetVolumeCapacity(CodexStartupConfig config)
{
2024-06-08 10:36:23 +02:00
if (config.StorageQuota != null) return config.StorageQuota.Multiply(1.2);
2023-09-08 09:39:56 +02:00
// Default Codex quota: 8 Gb, using +20% to be safe.
return 8.GB().Multiply(1.2);
}
2023-04-12 13:53:55 +02:00
}
}