Removes pre-assigned service ports and reads back service-ports assigned by k8s cluster.
This commit is contained in:
parent
cda63ba245
commit
8ba4b1a290
|
@ -6,7 +6,6 @@ namespace KubernetesWorkflow
|
|||
{
|
||||
private static object instanceLock = new object();
|
||||
private static ApplicationLifecycle? instance;
|
||||
private readonly NumberSource servicePortNumberSource = new NumberSource(30001);
|
||||
private readonly NumberSource namespaceNumberSource = new NumberSource(0);
|
||||
|
||||
private ApplicationLifecycle()
|
||||
|
@ -27,11 +26,6 @@ namespace KubernetesWorkflow
|
|||
}
|
||||
}
|
||||
|
||||
public NumberSource GetServiceNumberSource()
|
||||
{
|
||||
return servicePortNumberSource;
|
||||
}
|
||||
|
||||
public string GetTestNamespace()
|
||||
{
|
||||
return namespaceNumberSource.GetNextNumber().ToString("D5");
|
||||
|
|
|
@ -439,7 +439,7 @@ namespace KubernetesWorkflow
|
|||
{
|
||||
var result = new Dictionary<ContainerRecipe, Port[]>();
|
||||
|
||||
var ports = CreateServicePorts(result, containerRecipes);
|
||||
var ports = CreateServicePorts(containerRecipes);
|
||||
|
||||
if (!ports.Any())
|
||||
{
|
||||
|
@ -462,9 +462,40 @@ namespace KubernetesWorkflow
|
|||
|
||||
client.Run(c => c.CreateNamespacedService(serviceSpec, K8sTestNamespace));
|
||||
|
||||
ReadBackServiceAndMapPorts(serviceSpec, containerRecipes, 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)
|
||||
{
|
||||
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>();
|
||||
foreach (var recipe in recipes)
|
||||
{
|
||||
result.AddRange(CreateServicePorts(servicePorts, recipe));
|
||||
result.AddRange(CreateServicePorts(recipe));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private List<V1ServicePort> CreateServicePorts(Dictionary<ContainerRecipe, Port[]> servicePorts, ContainerRecipe recipe)
|
||||
private List<V1ServicePort> CreateServicePorts(ContainerRecipe recipe)
|
||||
{
|
||||
var result = new List<V1ServicePort>();
|
||||
var usedPorts = new List<Port>();
|
||||
foreach (var port in recipe.ExposedPorts)
|
||||
{
|
||||
var servicePort = workflowNumberSource.GetServicePort();
|
||||
usedPorts.Add(new Port(servicePort, ""));
|
||||
|
||||
result.Add(new V1ServicePort
|
||||
{
|
||||
Name = GetNameForPort(recipe, port),
|
||||
Protocol = "TCP",
|
||||
Port = port.Number,
|
||||
TargetPort = GetNameForPort(recipe, port),
|
||||
NodePort = servicePort
|
||||
});
|
||||
}
|
||||
|
||||
servicePorts.Add(recipe, usedPorts.ToArray());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@ namespace KubernetesWorkflow
|
|||
public StartupWorkflow CreateWorkflow()
|
||||
{
|
||||
var workflowNumberSource = new WorkflowNumberSource(numberSource.GetNextNumber(),
|
||||
ApplicationLifecycle.Instance.GetServiceNumberSource(),
|
||||
containerNumberSource);
|
||||
|
||||
return new StartupWorkflow(log, workflowNumberSource, cluster, knownPods, testNamespace);
|
||||
|
|
|
@ -4,13 +4,11 @@ namespace KubernetesWorkflow
|
|||
{
|
||||
public class WorkflowNumberSource
|
||||
{
|
||||
private readonly NumberSource servicePortNumberSource;
|
||||
private readonly NumberSource containerNumberSource;
|
||||
|
||||
public WorkflowNumberSource(int workflowNumber, NumberSource servicePortNumberSource, NumberSource containerNumberSource)
|
||||
public WorkflowNumberSource(int workflowNumber, NumberSource containerNumberSource)
|
||||
{
|
||||
WorkflowNumber = workflowNumber;
|
||||
this.servicePortNumberSource = servicePortNumberSource;
|
||||
this.containerNumberSource = containerNumberSource;
|
||||
}
|
||||
|
||||
|
@ -20,10 +18,5 @@ namespace KubernetesWorkflow
|
|||
{
|
||||
return containerNumberSource.GetNextNumber();
|
||||
}
|
||||
|
||||
public int GetServicePort()
|
||||
{
|
||||
return servicePortNumberSource.GetNextNumber();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue