From 950b10cc8bc44487be44da3e6b12e60be5306d39 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Fri, 2 Oct 2015 14:24:58 +0200 Subject: [PATCH] Support running Python console in Docker container. --- .../com/intellij/remote/RemoteProcess.java | 11 ------- .../com/intellij/remote/RemoteSshProcess.java | 2 +- .../src/com/intellij/remote/Tunnelable.java | 32 +++++++++++++++++++ .../python/console/PydevConsoleRunner.java | 21 ++++++------ .../python/run/PyRemoteProcessStarter.java | 3 ++ 5 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/remote/Tunnelable.java diff --git a/platform/platform-impl/src/com/intellij/remote/RemoteProcess.java b/platform/platform-impl/src/com/intellij/remote/RemoteProcess.java index 3e1546725194..134867fa27b5 100644 --- a/platform/platform-impl/src/com/intellij/remote/RemoteProcess.java +++ b/platform/platform-impl/src/com/intellij/remote/RemoteProcess.java @@ -24,15 +24,4 @@ public abstract class RemoteProcess extends Process implements SelfKiller { public abstract boolean killProcessTree(); public abstract boolean isDisconnected(); - - /** - * Makes host:localPort server which is available on local side available on remote side as localhost:remotePort. - */ - public abstract void addRemoteTunnel(int remotePort, String host, int localPort) throws RemoteSdkException; - - /** - * Makes host:remotePort server which is available on remote side available on local side as localhost:localPort. - */ - public abstract void addLocalTunnel(int localPort, String host, int remotePort) throws RemoteSdkException; - } diff --git a/platform/platform-impl/src/com/intellij/remote/RemoteSshProcess.java b/platform/platform-impl/src/com/intellij/remote/RemoteSshProcess.java index 83f8e57020ca..e9375ab176c7 100644 --- a/platform/platform-impl/src/com/intellij/remote/RemoteSshProcess.java +++ b/platform/platform-impl/src/com/intellij/remote/RemoteSshProcess.java @@ -5,7 +5,7 @@ import com.intellij.execution.process.SelfKiller; /** * @author traff */ -abstract public class RemoteSshProcess extends RemoteProcess implements SelfKiller { +abstract public class RemoteSshProcess extends RemoteProcess implements SelfKiller, Tunnelable { /** * @deprecated use {@link #killProcessTree()} */ diff --git a/platform/platform-impl/src/com/intellij/remote/Tunnelable.java b/platform/platform-impl/src/com/intellij/remote/Tunnelable.java new file mode 100644 index 000000000000..a090a2682be8 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/remote/Tunnelable.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.remote; + +/** + * @author traff + */ +public interface Tunnelable { + /** + * Makes host:localPort server which is available on local side available on remote side as localhost:remotePort. + */ + void addRemoteTunnel(int remotePort, String host, int localPort) throws RemoteSdkException; + + /** + * Makes host:remotePort server which is available on remote side available on local side as localhost:localPort. + */ + void addLocalTunnel(int localPort, int remotePort) throws RemoteSdkException; + +} diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java index 9fa1fe2899a0..e36992de1dca 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java @@ -67,6 +67,7 @@ import com.intellij.openapi.vfs.encoding.EncodingProjectManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.remote.RemoteProcess; +import com.intellij.remote.Tunnelable; import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; @@ -87,10 +88,7 @@ import com.jetbrains.python.remote.PyRemotePathMapper; import com.jetbrains.python.remote.PyRemoteProcessHandlerBase; import com.jetbrains.python.remote.PyRemoteSdkAdditionalDataBase; import com.jetbrains.python.remote.PythonRemoteInterpreterManager; -import com.jetbrains.python.run.PyRemoteProcessStarterManagerUtil; -import com.jetbrains.python.run.PythonCommandLineState; -import com.jetbrains.python.run.PythonRunParams; -import com.jetbrains.python.run.PythonTracebackFilter; +import com.jetbrains.python.run.*; import com.jetbrains.python.sdk.PySdkUtil; import com.jetbrains.python.sdk.PythonSdkType; import com.jetbrains.python.sdk.flavors.PythonSdkFlavor; @@ -481,11 +479,12 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory remotePorts = getRemotePortsFromProcess(remoteProcess); - //remoteProcess.addLocalTunnel(myPorts[0], myRemoteCredentials.getHost(), remotePorts.first); - remoteProcess.addRemoteTunnel(remotePorts.second, "localhost", myPorts[1]); - + if (remoteProcess instanceof Tunnelable) { + Tunnelable tunnelableProcess = (Tunnelable) remoteProcess; + tunnelableProcess.addLocalTunnel(myPorts[0], remotePorts.first); + tunnelableProcess.addRemoteTunnel(remotePorts.second, "localhost", myPorts[1]); + } myPydevConsoleCommunication = new PydevRemoteConsoleCommunication(getProject(), myPorts[0], remoteProcess, myPorts[1]); return remoteProcess; } catch (Exception e) { - throw new ExecutionException(e.getMessage()); + throw new ExecutionException(e.getMessage(), e); } } diff --git a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java index 80335db376a5..946adc5bd0af 100644 --- a/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java +++ b/python/src/com/jetbrains/python/run/PyRemoteProcessStarter.java @@ -24,6 +24,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkAdditionalData; +import com.intellij.openapi.util.Key; import com.jetbrains.python.remote.PyRemotePathMapper; import com.jetbrains.python.remote.PyRemoteProcessHandlerBase; import com.jetbrains.python.remote.PyRemoteSdkAdditionalDataBase; @@ -35,6 +36,8 @@ import org.jetbrains.annotations.Nullable; * @author traff */ public class PyRemoteProcessStarter { + public static final Key OPEN_FOR_INCOMING_CONNECTION = Key.create("OPEN_FOR_INCOMING_CONNECTION"); + public ProcessHandler startRemoteProcess(@NotNull Sdk sdk, @NotNull GeneralCommandLine commandLine, @Nullable Project project,