diff --git a/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ServerConfig.java b/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ServerConfig.java index c613965425..0bf9831726 100644 --- a/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ServerConfig.java +++ b/core/che-core-api-model/src/main/java/org/eclipse/che/api/core/model/workspace/config/ServerConfig.java @@ -10,6 +10,8 @@ */ package org.eclipse.che.api.core.model.workspace.config; +import org.eclipse.che.commons.annotation.Nullable; + /** * Configuration of server that can be started inside of machine. * @@ -47,5 +49,6 @@ public interface ServerConfig { String getProtocol(); /** Path used by server. */ + @Nullable String getPath(); } diff --git a/infrastructures/docker/src/main/java/org/eclipse/che/workspace/infrastructure/docker/Labels.java b/infrastructures/docker/src/main/java/org/eclipse/che/workspace/infrastructure/docker/Labels.java index a3934b4e17..231e2bb292 100644 --- a/infrastructures/docker/src/main/java/org/eclipse/che/workspace/infrastructure/docker/Labels.java +++ b/infrastructures/docker/src/main/java/org/eclipse/che/workspace/infrastructure/docker/Labels.java @@ -94,7 +94,9 @@ public final class Labels { public Serializer server(String ref, ServerConfig server) { labels.put(String.format(SERVER_PORT_LABEL_FMT, ref), server.getPort()); labels.put(String.format(SERVER_PROTOCOL_LABEL_FMT, ref), server.getProtocol()); - labels.put(String.format(SERVER_PATH_LABEL_FMT, ref), server.getPath()); + if (server.getPath() != null) { + labels.put(String.format(SERVER_PATH_LABEL_FMT, ref), server.getPath()); + } return this; } diff --git a/infrastructures/docker/src/test/java/org/eclipse/che/workspace/infrastructure/docker/LabelsTest.java b/infrastructures/docker/src/test/java/org/eclipse/che/workspace/infrastructure/docker/LabelsTest.java index 89f4bde634..ca5abd4a27 100644 --- a/infrastructures/docker/src/test/java/org/eclipse/che/workspace/infrastructure/docker/LabelsTest.java +++ b/infrastructures/docker/src/test/java/org/eclipse/che/workspace/infrastructure/docker/LabelsTest.java @@ -11,9 +11,9 @@ package org.eclipse.che.workspace.infrastructure.docker; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; import com.google.common.collect.ImmutableMap; +import java.util.HashMap; import java.util.Map; import org.eclipse.che.api.core.model.workspace.config.ServerConfig; import org.eclipse.che.api.core.model.workspace.runtime.RuntimeIdentity; @@ -36,6 +36,7 @@ public class LabelsTest { .runtimeId(new RuntimeIdentityImpl("workspace123", "my-env", "owner")) .server("my-server1/http", new ServerConfigImpl("8000/tcp", "http", "/api/info")) .server("my-server2", new ServerConfigImpl("8080/tcp", "ws", "/connect")) + .server("my-server3", new ServerConfigImpl("7070/tcp", "http", null)) .labels(); Map expected = ImmutableMap.builder() @@ -49,6 +50,8 @@ public class LabelsTest { .put("org.eclipse.che.server.my-server2.port", "8080/tcp") .put("org.eclipse.che.server.my-server2.protocol", "ws") .put("org.eclipse.che.server.my-server2.path", "/connect") + .put("org.eclipse.che.server.my-server3.port", "7070/tcp") + .put("org.eclipse.che.server.my-server3.protocol", "http") .build(); assertEquals(serialized, expected); @@ -70,9 +73,15 @@ public class LabelsTest { .put("org.eclipse.che.server.my-server2.port", "8080/tcp") .put("org.eclipse.che.server.my-server2.protocol", "ws") .put("org.eclipse.che.server.my-server2.path", "/connect") + .put("org.eclipse.che.server.my-server3.port", "7070/tcp") + .put("org.eclipse.che.server.my-server3.protocol", "http") .build(); Labels.Deserializer deserializer = Labels.newDeserializer(labels); + Map expectedServers = new HashMap<>(); + expectedServers.put("my-server1/http", new ServerConfigImpl("8000/tcp", "http", "/api/info")); + expectedServers.put("my-server2", new ServerConfigImpl("8080/tcp", "ws", "/connect")); + expectedServers.put("my-server3", new ServerConfigImpl("7070/tcp", "http", null)); assertEquals(deserializer.machineName(), "dev-machine"); @@ -82,16 +91,6 @@ public class LabelsTest { assertEquals(runtimeId.getOwner(), "owner", "workspace owner"); Map servers = deserializer.servers(); - ServerConfig server1 = servers.get("my-server1/http"); - assertNotNull(server1, "first server"); - assertEquals(server1.getPort(), "8000/tcp"); - assertEquals(server1.getProtocol(), "http"); - assertEquals(server1.getPath(), "/api/info"); - - ServerConfig server2 = servers.get("my-server2"); - assertNotNull(server2, "second server"); - assertEquals(server2.getPort(), "8080/tcp"); - assertEquals(server2.getProtocol(), "ws"); - assertEquals(server2.getPath(), "/connect"); + assertEquals(servers, expectedServers); } } diff --git a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolver.java b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolver.java index 2d5f3f0a1f..ef09c63153 100644 --- a/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolver.java +++ b/infrastructures/openshift/src/main/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolver.java @@ -70,17 +70,30 @@ public class ServerResolver { (name, config) -> servers.put( name, - new ServerImpl( - config.getProtocol() - + "://" - + route.getSpec().getHost() - + config.getPath(), - ServerStatus.UNKNOWN))); + newServer( + config.getProtocol(), route.getSpec().getHost(), config.getPath()))); } } return servers; } + private ServerImpl newServer(String protocol, String host, String path) { + StringBuilder ub = new StringBuilder(); + if (protocol != null) { + ub.append(protocol).append("://"); + } else { + ub.append("tcp://"); + } + ub.append(host); + if (path != null) { + if (!path.isEmpty() && !path.startsWith("/")) { + ub.append("/"); + } + ub.append(path); + } + return new ServerImpl(ub.toString(), ServerStatus.UNKNOWN); + } + private List getMatchedServices(Pod pod, Container container) { return services .stream() diff --git a/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolverTest.java b/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolverTest.java index 5ed4d6cbc1..cd5ef789f7 100644 --- a/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolverTest.java +++ b/infrastructures/openshift/src/test/java/org/eclipse/che/workspace/infrastructure/openshift/ServerResolverTest.java @@ -11,6 +11,7 @@ package org.eclipse.che.workspace.infrastructure.openshift; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -105,6 +106,63 @@ public class ServerResolverTest { assertEquals(resolved.get("ws-server"), new ServerImpl("ws://localhost/connect")); } + @Test + public void testResolvingServersWhenThereIsMatchedServiceForContainerAndServerPathIsNull() { + Container container = createContainer(); + Pod pod = createPod(singletonMap("kind", "web-app")); + Service nonMatchedByPodService = + createService("matched", CONTAINER_PORT, singletonMap("kind", "web-app")); + Route route = + createRoute( + "matched", singletonMap("http-server", new ServerConfigImpl("3054", "http", null))); + + ServerResolver serverResolver = + ServerResolver.of(singletonList(nonMatchedByPodService), singletonList(route)); + + Map resolved = serverResolver.resolve(pod, container); + + assertEquals(resolved.size(), 1); + assertEquals(resolved.get("http-server"), new ServerImpl("http://localhost")); + } + + @Test + public void testResolvingServersWhenThereIsMatchedServiceForContainerAndServerPathIsEmpty() { + Container container = createContainer(); + Pod pod = createPod(singletonMap("kind", "web-app")); + Service nonMatchedByPodService = + createService("matched", CONTAINER_PORT, singletonMap("kind", "web-app")); + Route route = + createRoute( + "matched", singletonMap("http-server", new ServerConfigImpl("3054", "http", ""))); + + ServerResolver serverResolver = + ServerResolver.of(singletonList(nonMatchedByPodService), singletonList(route)); + + Map resolved = serverResolver.resolve(pod, container); + + assertEquals(resolved.size(), 1); + assertEquals(resolved.get("http-server"), new ServerImpl("http://localhost")); + } + + @Test + public void testResolvingServersWhenThereIsMatchedServiceForContainerAndServerPathIsRelative() { + Container container = createContainer(); + Pod pod = createPod(singletonMap("kind", "web-app")); + Service nonMatchedByPodService = + createService("matched", CONTAINER_PORT, singletonMap("kind", "web-app")); + Route route = + createRoute( + "matched", singletonMap("http-server", new ServerConfigImpl("3054", "http", "api"))); + + ServerResolver serverResolver = + ServerResolver.of(singletonList(nonMatchedByPodService), singletonList(route)); + + Map resolved = serverResolver.resolve(pod, container); + + assertEquals(resolved.size(), 1); + assertEquals(resolved.get("http-server"), new ServerImpl("http://localhost/api")); + } + private Pod createPod(Map labels) { return new PodBuilder().withNewMetadata().withLabels(labels).endMetadata().build(); } diff --git a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImpl.java b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImpl.java index 257b0d08aa..eefdf1b81e 100644 --- a/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImpl.java +++ b/wsmaster/che-core-api-workspace/src/main/java/org/eclipse/che/api/workspace/server/model/impl/ServerConfigImpl.java @@ -105,7 +105,7 @@ public class ServerConfigImpl implements ServerConfig { return Objects.equals(id, that.id) && Objects.equals(port, that.port) && Objects.equals(protocol, that.protocol) - && getPath().equals(that.getPath()); + && Objects.equals(path, that.path); } @Override