2023-09-08 07:39:56 +00:00
|
|
|
|
using Utils;
|
|
|
|
|
|
|
|
|
|
namespace KubernetesWorkflow
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
|
|
|
|
public abstract class ContainerRecipeFactory
|
|
|
|
|
{
|
|
|
|
|
private readonly List<Port> exposedPorts = new List<Port>();
|
|
|
|
|
private readonly List<Port> internalPorts = new List<Port>();
|
|
|
|
|
private readonly List<EnvVar> envVars = new List<EnvVar>();
|
2023-09-04 07:08:34 +00:00
|
|
|
|
private readonly PodLabels podLabels = new PodLabels();
|
|
|
|
|
private readonly PodAnnotations podAnnotations = new PodAnnotations();
|
2023-09-07 06:19:19 +00:00
|
|
|
|
private readonly List<VolumeMount> volumeMounts = new List<VolumeMount>();
|
2023-04-14 10:37:05 +00:00
|
|
|
|
private readonly List<object> additionals = new List<object>();
|
2023-04-12 11:53:55 +00:00
|
|
|
|
private RecipeComponentFactory factory = null!;
|
2023-09-18 13:45:21 +00:00
|
|
|
|
private ContainerResources resources = new ContainerResources();
|
2023-04-12 11:53:55 +00:00
|
|
|
|
|
2023-04-14 08:51:35 +00:00
|
|
|
|
public ContainerRecipe CreateRecipe(int index, int containerNumber, RecipeComponentFactory factory, StartupConfig config)
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
|
|
|
|
this.factory = factory;
|
|
|
|
|
ContainerNumber = containerNumber;
|
2023-04-14 08:51:35 +00:00
|
|
|
|
Index = index;
|
2023-04-12 11:53:55 +00:00
|
|
|
|
|
|
|
|
|
Initialize(config);
|
|
|
|
|
|
2023-09-18 13:45:21 +00:00
|
|
|
|
var recipe = new ContainerRecipe(containerNumber, config.NameOverride, Image, resources,
|
2023-09-04 07:08:34 +00:00
|
|
|
|
exposedPorts.ToArray(),
|
2023-09-07 06:19:19 +00:00
|
|
|
|
internalPorts.ToArray(),
|
|
|
|
|
envVars.ToArray(),
|
2023-09-04 07:08:34 +00:00
|
|
|
|
podLabels.Clone(),
|
|
|
|
|
podAnnotations.Clone(),
|
2023-09-07 06:19:19 +00:00
|
|
|
|
volumeMounts.ToArray(),
|
2023-09-20 08:13:29 +00:00
|
|
|
|
ContainerAdditionals.CreateFromUserData(additionals));
|
2023-04-13 08:11:33 +00:00
|
|
|
|
|
|
|
|
|
exposedPorts.Clear();
|
|
|
|
|
internalPorts.Clear();
|
|
|
|
|
envVars.Clear();
|
2023-09-04 07:08:34 +00:00
|
|
|
|
podLabels.Clear();
|
|
|
|
|
podAnnotations.Clear();
|
2023-09-07 06:19:19 +00:00
|
|
|
|
volumeMounts.Clear();
|
2023-04-14 10:37:05 +00:00
|
|
|
|
additionals.Clear();
|
2023-04-13 08:11:33 +00:00
|
|
|
|
this.factory = null!;
|
2023-09-18 13:45:21 +00:00
|
|
|
|
resources = new ContainerResources();
|
2023-04-13 08:11:33 +00:00
|
|
|
|
|
|
|
|
|
return recipe;
|
2023-04-12 11:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-07 13:51:44 +00:00
|
|
|
|
public abstract string AppName { get; }
|
2023-07-17 09:12:14 +00:00
|
|
|
|
public abstract string Image { get; }
|
2023-04-12 11:53:55 +00:00
|
|
|
|
protected int ContainerNumber { get; private set; } = 0;
|
2023-04-14 08:51:35 +00:00
|
|
|
|
protected int Index { get; private set; } = 0;
|
2023-04-12 11:53:55 +00:00
|
|
|
|
protected abstract void Initialize(StartupConfig config);
|
|
|
|
|
|
2023-04-13 12:36:17 +00:00
|
|
|
|
protected Port AddExposedPort(string tag = "")
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
2023-09-15 13:52:02 +00:00
|
|
|
|
return AddExposedPort(factory.CreatePort(tag));
|
2023-04-12 11:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-08-11 07:37:30 +00:00
|
|
|
|
protected Port AddExposedPort(int number, string tag = "")
|
|
|
|
|
{
|
2023-09-15 13:52:02 +00:00
|
|
|
|
return AddExposedPort(factory.CreatePort(number, tag));
|
2023-08-11 07:37:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 12:36:17 +00:00
|
|
|
|
protected Port AddInternalPort(string tag = "")
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
2023-04-13 12:36:17 +00:00
|
|
|
|
var p = factory.CreatePort(tag);
|
2023-04-12 11:53:55 +00:00
|
|
|
|
internalPorts.Add(p);
|
|
|
|
|
return p;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 12:36:17 +00:00
|
|
|
|
protected void AddExposedPortAndVar(string name, string tag = "")
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
2023-04-13 12:36:17 +00:00
|
|
|
|
AddEnvVar(name, AddExposedPort(tag));
|
2023-04-12 11:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-13 12:36:17 +00:00
|
|
|
|
protected void AddInternalPortAndVar(string name, string tag = "")
|
2023-04-12 11:53:55 +00:00
|
|
|
|
{
|
2023-04-13 12:36:17 +00:00
|
|
|
|
AddEnvVar(name, AddInternalPort(tag));
|
2023-04-12 11:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void AddEnvVar(string name, string value)
|
|
|
|
|
{
|
|
|
|
|
envVars.Add(factory.CreateEnvVar(name, value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void AddEnvVar(string name, Port value)
|
|
|
|
|
{
|
|
|
|
|
envVars.Add(factory.CreateEnvVar(name, value.Number));
|
|
|
|
|
}
|
2023-04-14 10:37:05 +00:00
|
|
|
|
|
2023-09-04 07:08:34 +00:00
|
|
|
|
protected void AddPodLabel(string name, string value)
|
|
|
|
|
{
|
|
|
|
|
podLabels.Add(name, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void AddPodAnnotation(string name, string value)
|
|
|
|
|
{
|
|
|
|
|
podAnnotations.Add(name, value);
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-08 07:39:56 +00:00
|
|
|
|
protected void AddVolume(string mountPath, ByteSize volumeSize)
|
2023-09-07 06:19:19 +00:00
|
|
|
|
{
|
|
|
|
|
volumeMounts.Add(new VolumeMount(
|
|
|
|
|
$"autovolume-{Guid.NewGuid().ToString().ToLowerInvariant()}",
|
2023-09-07 08:37:52 +00:00
|
|
|
|
mountPath,
|
2023-09-08 07:39:56 +00:00
|
|
|
|
volumeSize.ToSuffixNotation()));
|
2023-09-07 06:19:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-14 10:37:05 +00:00
|
|
|
|
protected void Additional(object userData)
|
|
|
|
|
{
|
|
|
|
|
additionals.Add(userData);
|
|
|
|
|
}
|
2023-09-15 13:52:02 +00:00
|
|
|
|
|
2023-09-18 13:45:21 +00:00
|
|
|
|
protected void SetResourcesRequest(int milliCPUs, ByteSize memory)
|
|
|
|
|
{
|
|
|
|
|
SetResourcesRequest(new ContainerResourceSet(milliCPUs, memory));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void SetResourceLimits(int milliCPUs, ByteSize memory)
|
|
|
|
|
{
|
|
|
|
|
SetResourceLimits(new ContainerResourceSet(milliCPUs, memory));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void SetResourcesRequest(ContainerResourceSet requests)
|
|
|
|
|
{
|
|
|
|
|
resources.Requests = requests;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected void SetResourceLimits(ContainerResourceSet limits)
|
|
|
|
|
{
|
|
|
|
|
resources.Limits = limits;
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-15 13:52:02 +00:00
|
|
|
|
private Port AddExposedPort(Port port)
|
|
|
|
|
{
|
|
|
|
|
if (exposedPorts.Any())
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException("Current implementation only support 1 exposed port per container recipe. " +
|
|
|
|
|
$"Methods for determining container addresses in {nameof(StartupWorkflow)} currently rely on this constraint.");
|
|
|
|
|
}
|
|
|
|
|
exposedPorts.Add(port);
|
|
|
|
|
return port;
|
|
|
|
|
}
|
2023-04-12 11:53:55 +00:00
|
|
|
|
}
|
|
|
|
|
}
|