Skip to content

Commit 153d664

Browse files
Merge pull request #188 from msivasubramaniaan/fix-multi-connection
Add support for multi connection WS
2 parents 3e1e2e0 + 65b6f4d commit 153d664

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

src/main/kotlin/com/redhat/devtools/gateway/DevSpacesConnection.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.redhat.devtools.gateway.openshift.Pods
1919
import com.redhat.devtools.gateway.server.RemoteIDEServer
2020
import io.kubernetes.client.openapi.ApiException
2121
import java.io.IOException
22+
import java.net.ServerSocket
2223
import java.net.URI
2324

2425
class DevSpacesConnection(private val devSpacesContext: DevSpacesContext) {
@@ -29,10 +30,6 @@ class DevSpacesConnection(private val devSpacesContext: DevSpacesContext) {
2930
onDisconnected: () -> Unit,
3031
onDevWorkspaceStopped: () -> Unit,
3132
): ThinClientHandle {
32-
if (devSpacesContext.isConnected)
33-
throw IOException("Already connected to ${devSpacesContext.devWorkspace.name}")
34-
35-
devSpacesContext.isConnected = true
3633
try {
3734
return doConnect(onConnected, onDevWorkspaceStopped, onDisconnected)
3835
} catch (e: Exception) {
@@ -56,14 +53,17 @@ class DevSpacesConnection(private val devSpacesContext: DevSpacesContext) {
5653
?: throw IOException("Could not connect, remote IDE is not ready. No join link present.")
5754

5855
val pods = Pods(devSpacesContext.client)
59-
val forwarder = pods.forward(remoteIdeServer.pod, 5990, 5990)
60-
pods.waitForForwardReady(5990)
56+
// ✅ Dynamically find a free local port
57+
val localPort = findFreePort()
58+
val forwarder = pods.forward(remoteIdeServer.pod, localPort, 5990)
59+
pods.waitForForwardReady(localPort)
60+
val effectiveJoinLink = joinLink.replace(":5990", ":$localPort")
6161

6262
val client = LinkedClientManager
6363
.getInstance()
6464
.startNewClient(
6565
Lifetime.Eternal,
66-
URI(joinLink),
66+
URI(effectiveJoinLink),
6767
"",
6868
onConnected,
6969
false
@@ -93,6 +93,13 @@ class DevSpacesConnection(private val devSpacesContext: DevSpacesContext) {
9393
return client
9494
}
9595

96+
private fun findFreePort(): Int {
97+
ServerSocket(0).use { socket ->
98+
socket.reuseAddress = true
99+
return socket.localPort
100+
}
101+
}
102+
96103
@Throws(IOException::class, ApiException::class)
97104
private fun startAndWaitDevWorkspace() {
98105
if (!devSpacesContext.devWorkspace.started) {

src/main/kotlin/com/redhat/devtools/gateway/view/steps/DevSpacesWorkspacesStepView.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,6 @@ class DevSpacesWorkspacesStepView(
188188
}
189189

190190
private fun connect() {
191-
if (devSpacesContext.isConnected) {
192-
Dialogs.error("Already connected to ${devSpacesContext.devWorkspace.name}", "Connection failed")
193-
return
194-
}
195-
196191
getSelectedWorkspace().apply {
197192
if (this != null) {
198193
devSpacesContext.devWorkspace = this

0 commit comments

Comments
 (0)