diff --git a/jkube-kit/remote-dev/src/main/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentService.java b/jkube-kit/remote-dev/src/main/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentService.java index 805690529a..636a626773 100644 --- a/jkube-kit/remote-dev/src/main/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentService.java +++ b/jkube-kit/remote-dev/src/main/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentService.java @@ -62,12 +62,12 @@ public void stop() { private void checkEnvironment() { for (RemoteService remoteService : context.getRemoteDevelopmentConfig().getRemoteServices()) { - try (ServerSocket ignore = new ServerSocket(remoteService.getPort())) { + try (ServerSocket ignore = new ServerSocket(remoteService.getLocalPort())) { logger.debug("Local port '%s' for remote service '%s:%s' is available", remoteService.getLocalPort(), remoteService.getHostname(), remoteService.getPort()); } catch (Exception e) { throw new IllegalStateException( - "Local port '" + remoteService.getPort() + "' is already in use (" + remoteService.getHostname() + ")"); + "Local port '" + remoteService.getLocalPort() + "' is already in use (" + remoteService.getHostname() + ")"); } if (kubernetesClient.services().withName(remoteService.getHostname()).get() == null) { logger.warn("Service '%s' does not exist in the cluster, " + diff --git a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java index 13ac70412d..5bcc0ca0db 100644 --- a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java +++ b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java @@ -17,13 +17,24 @@ import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.util.IoUtil; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledIf; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -67,18 +78,44 @@ void canBeStoppedMultipleTimesBeforeStart() { @Test @DisplayName("start initiates PortForwarder and KubernetesSshServiceForwarder") void startInitiatesChildProcesses() { + // When + startDevelopmentServiceWithConfig(RemoteDevelopmentConfig.builder().build()); + + // Then + verify(logger, times(1)) + .debug("Creating or replacing Kubernetes services for exposed ports from local environment"); + verify(logger, times(1)) + .debug("Starting Kubernetes SSH service forwarder..."); + verify(logger, times(1)) + .debug("Starting port forwarder..."); + } + + @Test + @DisplayName("start initiates if LocalPort for remote service are available") + void startInitsIfLocalPortAvailable() { + RemoteService remoteService = RemoteService.builder() + .hostname("remote-host").localPort(IoUtil.getFreeRandomPort()).port(1234).build(); + RemoteDevelopmentConfig config = RemoteDevelopmentConfig.builder().remoteService(remoteService).build(); + + // When + startDevelopmentServiceWithConfig(config); + + // Then + verify(logger, times(1)) + .debug("Local port '%s' for remote service '%s:%s' is available", + remoteService.getLocalPort(),remoteService.getHostname(),remoteService.getPort()); + verify(logger, times(1)) + .debug("Creating or replacing Kubernetes services for exposed ports from local environment"); + } + + private void startDevelopmentServiceWithConfig(RemoteDevelopmentConfig remoteDevelopmentConfig) { CompletableFuture future = null; try { - // When - future = new RemoteDevelopmentService(logger, kubernetesClient, RemoteDevelopmentConfig.builder().build()) + future = new RemoteDevelopmentService(logger, kubernetesClient, remoteDevelopmentConfig) .start(); - // Then - verify(logger, times(1)) - .debug("Starting Kubernetes SSH service forwarder..."); - verify(logger, times(1)) - .debug("Starting port forwarder..."); } finally { Optional.ofNullable(future).ifPresent(f -> f.cancel(true)); } } + }