Do not create internal servers for public endpoints;

7.20.x
Max Shaposhnik 2020-04-30 10:40:47 +03:00 committed by GitHub
parent a9ae197a5e
commit aeccceea60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 20 deletions

View File

@ -186,7 +186,14 @@ public class KubernetesServerExposer<T extends KubernetesEnvironment> {
provisionServicesForDiscoverableServers(servers);
exposeNonSecureServers(internalServers, externalServers, unsecuredPorts);
Optional<Service> serviceOpt = createService(internalServers, unsecuredPorts);
if (serviceOpt.isPresent()) {
Service service = serviceOpt.get();
String serviceName = service.getMetadata().getName();
k8sEnv.getServices().put(serviceName, service);
exposeNonSecureServers(serviceName, externalServers, unsecuredPorts);
}
exposeSecureServers(secureServers, securedPorts);
}
@ -254,29 +261,11 @@ public class KubernetesServerExposer<T extends KubernetesEnvironment> {
}
private void exposeNonSecureServers(
Map<String, ServerConfig> internalServers,
String serviceName,
Map<String, ServerConfig> externalServers,
Map<String, ServicePort> unsecuredPorts)
throws InfrastructureException {
if (unsecuredPorts.isEmpty()) {
return;
}
Map<String, ServerConfig> allNonSecureServers = new HashMap<>(internalServers);
allNonSecureServers.putAll(externalServers);
Service service =
new ServerServiceBuilder()
.withName(generate(SERVER_PREFIX, SERVER_UNIQUE_PART_SIZE) + '-' + machineName)
.withMachineName(machineName)
.withSelectorEntry(CHE_ORIGINAL_NAME_LABEL, pod.getMetadata().getName())
.withPorts(new ArrayList<>(unsecuredPorts.values()))
.withServers(allNonSecureServers)
.build();
String serviceName = service.getMetadata().getName();
k8sEnv.getServices().put(serviceName, service);
for (ServicePort servicePort : unsecuredPorts.values()) {
// expose service port related external servers if exist
Map<String, ServerConfig> matchedExternalServers = match(externalServers, servicePort);
@ -290,6 +279,25 @@ public class KubernetesServerExposer<T extends KubernetesEnvironment> {
}
}
private Optional<Service> createService(
Map<String, ServerConfig> internalServers, Map<String, ServicePort> unsecuredPorts) {
Map<String, ServerConfig> allInternalServers = new HashMap<>(internalServers);
if (unsecuredPorts.isEmpty()) {
return Optional.empty();
}
Service service =
new ServerServiceBuilder()
.withName(generate(SERVER_PREFIX, SERVER_UNIQUE_PART_SIZE) + '-' + machineName)
.withMachineName(machineName)
.withSelectorEntry(CHE_ORIGINAL_NAME_LABEL, pod.getMetadata().getName())
.withPorts(new ArrayList<>(unsecuredPorts.values()))
.withServers(allInternalServers)
.build();
return Optional.of(service);
}
private void exposeSecureServers(
Map<String, ServerConfig> securedServers, Map<String, ServicePort> securedPorts)
throws InfrastructureException {

View File

@ -512,6 +512,13 @@ public class KubernetesServerExposerTest {
Annotations.Deserializer serviceAnnotations =
Annotations.newDeserializer(service.getMetadata().getAnnotations());
assertEquals(serviceAnnotations.machineName(), machineName);
// check that we did not create servers for public endpoints
assertFalse(
serviceAnnotations
.servers()
.keySet()
.stream()
.anyMatch(key -> expectedServers.containsKey(key)));
verify(externalServerExposer)
.expose(