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 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");
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue