cs-codex-dist-tests/Framework/KubernetesWorkflow/Recipe/ContainerRecipe.cs

143 lines
4.6 KiB
C#
Raw Normal View History

namespace KubernetesWorkflow.Recipe
2023-04-12 11:53:55 +00:00
{
public class ContainerRecipe
{
public ContainerRecipe(int number, string? nameOverride, string image, ContainerResources resources, SchedulingAffinity schedulingAffinity, bool setCriticalPriority, Port[] exposedPorts, Port[] internalPorts, EnvVar[] envVars, PodLabels podLabels, PodAnnotations podAnnotations, VolumeMount[] volumes, ContainerAdditionals additionals)
2023-04-12 11:53:55 +00:00
{
Number = number;
2023-09-15 10:25:10 +00:00
NameOverride = nameOverride;
2023-04-12 11:53:55 +00:00
Image = image;
2023-09-08 11:47:49 +00:00
Resources = resources;
SchedulingAffinity = schedulingAffinity;
SetCriticalPriority = setCriticalPriority;
2023-04-12 11:53:55 +00:00
ExposedPorts = exposedPorts;
InternalPorts = internalPorts;
EnvVars = envVars;
PodLabels = podLabels;
PodAnnotations = podAnnotations;
Volumes = volumes;
2023-04-14 10:37:05 +00:00
Additionals = additionals;
2023-09-15 10:25:10 +00:00
if (NameOverride != null)
{
Name = $"{K8sNameUtils.Format(NameOverride)}-{Number}";
}
else
{
Name = $"ctnr{Number}";
}
2023-10-19 09:12:08 +00:00
if (exposedPorts.Any(p => string.IsNullOrEmpty(p.Tag))) throw new Exception("Port tags are required for all exposed ports.");
2023-04-12 11:53:55 +00:00
}
2023-09-15 10:25:10 +00:00
public string Name { get; }
public int Number { get; }
2023-09-15 10:25:10 +00:00
public string? NameOverride { get; }
2023-09-08 11:47:49 +00:00
public ContainerResources Resources { get; }
public SchedulingAffinity SchedulingAffinity { get; }
public bool SetCriticalPriority { get; }
2023-04-12 11:53:55 +00:00
public string Image { get; }
public Port[] ExposedPorts { get; }
public Port[] InternalPorts { get; }
public EnvVar[] EnvVars { get; }
public PodLabels PodLabels { get; }
public PodAnnotations PodAnnotations { get; }
public VolumeMount[] Volumes { get; }
2023-09-20 08:13:29 +00:00
public ContainerAdditionals Additionals { get; }
2023-04-13 12:36:17 +00:00
2023-09-13 09:59:21 +00:00
public Port? GetPortByTag(string tag)
2023-04-13 12:36:17 +00:00
{
2023-09-13 09:59:21 +00:00
return ExposedPorts.Concat(InternalPorts).SingleOrDefault(p => p.Tag == tag);
2023-04-13 12:36:17 +00:00
}
public override string ToString()
{
return $"(container-recipe: {Name}, image: {Image}, " +
$"exposedPorts: {string.Join(",", ExposedPorts.Select(p => p.Number))}, " +
$"internalPorts: {string.Join(",", InternalPorts.Select(p => p.Number))}, " +
$"envVars: {string.Join(",", EnvVars.Select(v => v.ToString()))}, " +
2023-09-08 11:47:49 +00:00
$"limits: {Resources}, " +
$"affinity: {SchedulingAffinity}, " +
$"volumes: {string.Join(",", Volumes.Select(v => $"'{v.MountPath}'"))}";
}
2023-04-12 11:53:55 +00:00
}
public class Port
{
public Port(int number, string tag, PortProtocol protocol)
2023-04-12 11:53:55 +00:00
{
Number = number;
2023-04-13 12:36:17 +00:00
Tag = tag;
Protocol = protocol;
if (string.IsNullOrWhiteSpace(Tag))
{
throw new Exception("A unique port tag is required");
}
2023-04-12 11:53:55 +00:00
}
public int Number { get; }
2023-04-13 12:36:17 +00:00
public string Tag { get; }
public PortProtocol Protocol { get; }
public bool IsTcp()
{
return Protocol == PortProtocol.TCP;
}
public bool IsUdp()
{
return Protocol == PortProtocol.UDP;
}
2023-10-19 12:03:36 +00:00
public override string ToString()
{
if (string.IsNullOrEmpty(Tag)) return $"untagged-port={Number}/{Protocol}";
return $"{Tag}={Number}/{Protocol}";
2023-10-19 12:03:36 +00:00
}
2023-04-12 11:53:55 +00:00
}
public enum PortProtocol
{
TCP,
UDP
}
2023-04-12 11:53:55 +00:00
public class EnvVar
{
public EnvVar(string name, string value)
{
Name = name;
Value = value;
}
public string Name { get; }
public string Value { get; }
public override string ToString()
{
return $"'{Name}' = '{Value}'";
}
2023-04-12 11:53:55 +00:00
}
public class VolumeMount
{
public VolumeMount(string volumeName, string mountPath, string? subPath = null, string? resourceQuantity = null, string? secret = null, string? hostPath = null)
{
VolumeName = volumeName;
MountPath = mountPath;
SubPath = subPath;
ResourceQuantity = resourceQuantity;
Secret = secret;
HostPath = hostPath;
}
public string VolumeName { get; }
public string MountPath { get; }
public string? SubPath { get; }
public string? ResourceQuantity { get; }
public string? Secret { get; }
public string? HostPath { get; }
}
2023-04-12 11:53:55 +00:00
}