Removes pre-assigned service ports and reads back service-ports assigned by k8s cluster.

This commit is contained in:
benbierens 2023-06-02 11:07:36 +02:00
parent cda63ba245
commit 8ba4b1a290
No known key found for this signature in database
GPG Key ID: FE44815D96D0A1AA
4 changed files with 36 additions and 25 deletions

View File

@ -6,7 +6,6 @@ namespace KubernetesWorkflow
{ {
private static object instanceLock = new object(); private static object instanceLock = new object();
private static ApplicationLifecycle? instance; private static ApplicationLifecycle? instance;
private readonly NumberSource servicePortNumberSource = new NumberSource(30001);
private readonly NumberSource namespaceNumberSource = new NumberSource(0); private readonly NumberSource namespaceNumberSource = new NumberSource(0);
private ApplicationLifecycle() private ApplicationLifecycle()
@ -27,11 +26,6 @@ namespace KubernetesWorkflow
} }
} }
public NumberSource GetServiceNumberSource()
{
return servicePortNumberSource;
}
public string GetTestNamespace() public string GetTestNamespace()
{ {
return namespaceNumberSource.GetNextNumber().ToString("D5"); return namespaceNumberSource.GetNextNumber().ToString("D5");

View File

@ -439,7 +439,7 @@ namespace KubernetesWorkflow
{ {
var result = new Dictionary<ContainerRecipe, Port[]>(); var result = new Dictionary<ContainerRecipe, Port[]>();
var ports = CreateServicePorts(result, containerRecipes); var ports = CreateServicePorts(containerRecipes);
if (!ports.Any()) if (!ports.Any())
{ {
@ -462,9 +462,40 @@ namespace KubernetesWorkflow
client.Run(c => c.CreateNamespacedService(serviceSpec, K8sTestNamespace)); client.Run(c => c.CreateNamespacedService(serviceSpec, K8sTestNamespace));
ReadBackServiceAndMapPorts(serviceSpec, containerRecipes, result);
return (serviceSpec.Metadata.Name, result); return (serviceSpec.Metadata.Name, result);
} }
private void ReadBackServiceAndMapPorts(V1Service serviceSpec, ContainerRecipe[] containerRecipes, Dictionary<ContainerRecipe, Port[]> result)
{
// For each container-recipe, we need to figure out which service-ports it was assigned by K8s.
var readback = client.Run(c => c.ReadNamespacedService(serviceSpec.Metadata.Name, K8sTestNamespace));
foreach (var r in containerRecipes)
{
if (r.ExposedPorts.Any())
{
var firstExposedPort = r.ExposedPorts.First();
var portName = GetNameForPort(r, firstExposedPort);
var matchingServicePorts = readback.Spec.Ports.Where(p => p.Name == portName);
if (matchingServicePorts.Any())
{
// These service ports belongs to this recipe.
var optionals = matchingServicePorts.Select(p => MapNodePortIfAble(p, portName));
var ports = optionals.Where(p => p != null).Select(p => p!).ToArray();
result.Add(r, ports);
}
}
}
}
private Port? MapNodePortIfAble(V1ServicePort p, string tag)
{
if (p.NodePort == null) return null;
return new Port(p.NodePort.Value, tag);
}
private void DeleteService(string serviceName) private void DeleteService(string serviceName)
{ {
client.Run(c => c.DeleteNamespacedService(serviceName, K8sTestNamespace)); client.Run(c => c.DeleteNamespacedService(serviceName, K8sTestNamespace));
@ -479,36 +510,30 @@ namespace KubernetesWorkflow
}; };
} }
private List<V1ServicePort> CreateServicePorts(Dictionary<ContainerRecipe, Port[]> servicePorts, ContainerRecipe[] recipes) private List<V1ServicePort> CreateServicePorts(ContainerRecipe[] recipes)
{ {
var result = new List<V1ServicePort>(); var result = new List<V1ServicePort>();
foreach (var recipe in recipes) foreach (var recipe in recipes)
{ {
result.AddRange(CreateServicePorts(servicePorts, recipe)); result.AddRange(CreateServicePorts(recipe));
} }
return result; return result;
} }
private List<V1ServicePort> CreateServicePorts(Dictionary<ContainerRecipe, Port[]> servicePorts, ContainerRecipe recipe) private List<V1ServicePort> CreateServicePorts(ContainerRecipe recipe)
{ {
var result = new List<V1ServicePort>(); var result = new List<V1ServicePort>();
var usedPorts = new List<Port>();
foreach (var port in recipe.ExposedPorts) foreach (var port in recipe.ExposedPorts)
{ {
var servicePort = workflowNumberSource.GetServicePort();
usedPorts.Add(new Port(servicePort, ""));
result.Add(new V1ServicePort result.Add(new V1ServicePort
{ {
Name = GetNameForPort(recipe, port), Name = GetNameForPort(recipe, port),
Protocol = "TCP", Protocol = "TCP",
Port = port.Number, Port = port.Number,
TargetPort = GetNameForPort(recipe, port), TargetPort = GetNameForPort(recipe, port),
NodePort = servicePort
}); });
} }
servicePorts.Add(recipe, usedPorts.ToArray());
return result; return result;
} }

View File

@ -22,7 +22,6 @@ namespace KubernetesWorkflow
public StartupWorkflow CreateWorkflow() public StartupWorkflow CreateWorkflow()
{ {
var workflowNumberSource = new WorkflowNumberSource(numberSource.GetNextNumber(), var workflowNumberSource = new WorkflowNumberSource(numberSource.GetNextNumber(),
ApplicationLifecycle.Instance.GetServiceNumberSource(),
containerNumberSource); containerNumberSource);
return new StartupWorkflow(log, workflowNumberSource, cluster, knownPods, testNamespace); return new StartupWorkflow(log, workflowNumberSource, cluster, knownPods, testNamespace);

View File

@ -4,13 +4,11 @@ namespace KubernetesWorkflow
{ {
public class WorkflowNumberSource public class WorkflowNumberSource
{ {
private readonly NumberSource servicePortNumberSource;
private readonly NumberSource containerNumberSource; private readonly NumberSource containerNumberSource;
public WorkflowNumberSource(int workflowNumber, NumberSource servicePortNumberSource, NumberSource containerNumberSource) public WorkflowNumberSource(int workflowNumber, NumberSource containerNumberSource)
{ {
WorkflowNumber = workflowNumber; WorkflowNumber = workflowNumber;
this.servicePortNumberSource = servicePortNumberSource;
this.containerNumberSource = containerNumberSource; this.containerNumberSource = containerNumberSource;
} }
@ -20,10 +18,5 @@ namespace KubernetesWorkflow
{ {
return containerNumberSource.GetNextNumber(); return containerNumberSource.GetNextNumber();
} }
public int GetServicePort()
{
return servicePortNumberSource.GetNextNumber();
}
} }
} }