Author: xcoulon
Date: 2012-04-27 04:08:22 -0400 (Fri, 27 Apr 2012)
New Revision: 40551
Modified:
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardModel.java
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardPage.java
Log:
In progress - JBIDE-11073
OpenShift Express Tool: Create a way to invoke rhc-port-forward functionality which
enables users to debug their cloud environments with their local tools
in progress - JBIDE-11670
portforward: when duplicate remote ports the 127.0.0.1 is not good
Modified:
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardModel.java
===================================================================
---
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardModel.java 2012-04-27
08:07:55 UTC (rev 40550)
+++
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardModel.java 2012-04-27
08:08:22 UTC (rev 40551)
@@ -1,9 +1,14 @@
package org.jboss.tools.openshift.express.internal.core.portforward;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
+import org.eclipse.jdt.launching.SocketUtil;
+import org.eclipse.ui.console.MessageConsole;
+import org.eclipse.ui.console.MessageConsoleStream;
import org.jboss.tools.common.databinding.ObservablePojo;
+import org.jboss.tools.openshift.express.internal.ui.console.ConsoleUtils;
import com.jcraft.jsch.JSchException;
import com.openshift.client.IApplication;
@@ -13,13 +18,19 @@
public class ApplicationPortForwardingWizardModel extends ObservablePojo {
public static final String PROPERTY_USE_DEFAULT_LOCAL_IP_ADDRESS =
"useDefaultLocalIpAddress";
-
+
public static final String PROPERTY_FORWARDABLE_PORTS = "forwardablePorts";
-
+
+ public static final String PROPERTY_USE_FREE_PORTS = "useFreePorts";
+
+ public static final String PROPERTY_PORT_FORWARDING = "portForwarding";
+
private Boolean useDefaultLocalIpAddress = Boolean.TRUE;
-
+
+ private Boolean useFreePorts = Boolean.FALSE;
+
private final IApplication application;
-
+
public ApplicationPortForwardingWizardModel(final IApplication application) {
this.application = application;
}
@@ -31,49 +42,132 @@
return application;
}
+ public List<IApplicationPortForwarding> getForwardablePorts() throws
OpenShiftSSHOperationException {
+ return application.getForwardablePorts();
+ }
+
+ public boolean getPortForwarding() throws OpenShiftSSHOperationException {
+ return this.application.isPortFowardingStarted();
+ }
+
+ public void startPortForwarding() throws OpenShiftSSHOperationException {
+ if (this.application.isPortFowardingStarted()) {
+ return;
+ }
+ final MessageConsole console = ConsoleUtils.findMessageConsole(application.getUUID());
+ ConsoleUtils.displayConsoleView(console);
+ MessageConsoleStream stream = console.newMessageStream();
+ stream.println("Starting port-forwarding...");
+ this.application.startPortForwarding();
+ for (IApplicationPortForwarding port : this.application.getForwardablePorts()) {
+ stream.println(" " + getPortStatus(port));
+ }
+ stream.println("done.");
+ firePropertyChange(PROPERTY_PORT_FORWARDING, false,
this.application.isPortFowardingStarted());
+ }
+
+ public void stopPortForwarding() throws OpenShiftSSHOperationException {
+ if (!this.application.isPortFowardingStarted()) {
+ return;
+ }
+ final MessageConsole console = ConsoleUtils.findMessageConsole(application.getUUID());
+ ConsoleUtils.displayConsoleView(console);
+ MessageConsoleStream stream = console.newMessageStream();
+ stream.println("Stopping port-forwarding...");
+ this.application.stopPortForwarding();
+ for (IApplicationPortForwarding port : this.application.getForwardablePorts()) {
+ stream.println(" " + getPortStatus(port));
+ }
+ stream.println("done.");
+
+ firePropertyChange(PROPERTY_PORT_FORWARDING, true,
this.application.isPortFowardingStarted());
+ }
+
/**
+ * @param port
+ * @return
+ * @throws OpenShiftSSHOperationException
+ */
+ private String getPortStatus(IApplicationPortForwarding port) throws
OpenShiftSSHOperationException {
+ return port.getName() + " " + port.getLocalAddress() + ":" +
port.getLocalPort() + " -> "
+ + port.getRemoteAddress() + ":" + port.getRemotePort() + " "
+ + (port.isStarted(application.getSSHSession()) ? "(started)" :
"(stopped)");
+ }
+
+ /**
* @return the useDefaultLocalIpAddress
*/
public final Boolean getUseDefaultLocalIpAddress() {
return useDefaultLocalIpAddress;
}
-
- public List<IApplicationPortForwarding> getForwardablePorts() throws
OpenShiftSSHOperationException {
- return application.getForwardablePorts();
- }
-
/**
- * @param useDefaultLocalIpAddress the useDefaultLocalIpAddress to set
- * @throws IOException
- * @throws JSchException
+ * @param useDefaultLocalIpAddress
+ * the useDefaultLocalIpAddress to set
+ * @throws IOException
+ * @throws JSchException
*/
- public final void setUseDefaultLocalIpAddress(final Boolean useDefaultLocalIpAddress)
throws OpenShiftSSHOperationException {
- updateLocalBindingValues(useDefaultLocalIpAddress);
+ public final void setUseDefaultLocalIpAddress(final Boolean useDefaultLocalIpAddress)
+ throws OpenShiftSSHOperationException {
+ updateLocalAddressBindings(useDefaultLocalIpAddress);
firePropertyChange(PROPERTY_USE_DEFAULT_LOCAL_IP_ADDRESS,
this.useDefaultLocalIpAddress,
this.useDefaultLocalIpAddress = useDefaultLocalIpAddress);
}
- private void updateLocalBindingValues(final boolean useLocalIpAddress) throws
OpenShiftSSHOperationException {
- for (IApplicationPortForwarding port : application.getForwardablePorts()) {
+ /**
+ * @return the useFreePorts
+ */
+ public Boolean getUseFreePorts() {
+ return useFreePorts;
+ }
+
+ /**
+ * @param useFreePorts
+ * the useFreePorts to set
+ * @throws OpenShiftSSHOperationException
+ */
+ public void setUseFreePorts(Boolean useFreePorts) throws OpenShiftSSHOperationException
{
+ updateLocalPortBindings(useFreePorts);
+ firePropertyChange(PROPERTY_USE_DEFAULT_LOCAL_IP_ADDRESS, this.useFreePorts,
this.useFreePorts = useFreePorts);
+ }
+
+ private void updateLocalAddressBindings(final boolean useLocalIpAddress) throws
OpenShiftSSHOperationException {
+ final List<IApplicationPortForwarding> ports =
application.getForwardablePorts();
+ for (IApplicationPortForwarding port : ports) {
port.setLocalAddress(useLocalIpAddress ? "127.0.0.1" :
port.getRemoteAddress());
- if (port.getLocalPort() == null) {
- port.setLocalPort(port.getRemotePort());
+ }
+ }
+
+ private void updateLocalPortBindings(final boolean useFreePorts) throws
OpenShiftSSHOperationException {
+ final List<IApplicationPortForwarding> ports =
application.getForwardablePorts();
+ final List<String> bindings = new ArrayList<String>();
+ // update local bindings while avoiding duplicates
+ for (IApplicationPortForwarding port : ports) {
+ // find duplicate
+ String key = null;
+ int remotePort = port.getRemotePort();
+ while (key == null || bindings.contains(key)) {
+ if (useFreePorts) {
+ port.setLocalPort(SocketUtil.findFreePort());
+ } else {
+ port.setLocalPort(remotePort);
+ }
+ key = port.getRemotePort() + ":" + port.getLocalPort();
+ remotePort++;
}
- }
+ bindings.add(key);
+ }
}
public void loadForwardablePorts() throws OpenShiftSSHOperationException {
getApplication().getForwardablePorts();
refreshForwardablePorts();
}
-
+
public void refreshForwardablePorts() throws OpenShiftSSHOperationException {
application.refreshForwardablePorts();
- updateLocalBindingValues(this.useDefaultLocalIpAddress);
+ updateLocalAddressBindings(this.useDefaultLocalIpAddress);
+ updateLocalPortBindings(this.useFreePorts);
}
-
-
-
}
Modified:
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardPage.java
===================================================================
---
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardPage.java 2012-04-27
08:07:55 UTC (rev 40550)
+++
trunk/openshift/plugins/org.jboss.tools.openshift.express.ui/src/org/jboss/tools/openshift/express/internal/core/portforward/ApplicationPortForwardingWizardPage.java 2012-04-27
08:08:22 UTC (rev 40551)
@@ -28,6 +28,8 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.jboss.tools.common.ui.WizardUtils;
+import org.jboss.tools.common.ui.databinding.InvertingBooleanConverter;
+import org.jboss.tools.common.ui.databinding.ValueBindingBuilder;
import org.jboss.tools.openshift.express.internal.ui.OpenShiftUIActivator;
import org.jboss.tools.openshift.express.internal.ui.utils.Logger;
import org.jboss.tools.openshift.express.internal.ui.wizard.AbstractOpenShiftWizardPage;
@@ -85,6 +87,7 @@
startButton.setEnabled(true);
GridDataFactory.fillDefaults().hint(110, SWT.DEFAULT).align(SWT.FILL,
SWT.TOP).applyTo(startButton);
startButton.addSelectionListener(onStartPortForwarding());
+
stopButton = new Button(container, SWT.PUSH);
stopButton.setText("Stop All");
@@ -93,11 +96,11 @@
stopButton.addSelectionListener(onStopPortForwarding());
// checkbox to use the default "127.0.0.1" local IP address
- Button useLocalIpAddressButton = new Button(container, SWT.CHECK);
- useLocalIpAddressButton.setText("Use '127.0.0.1' as the local address for
all ports");
- GridDataFactory.fillDefaults().span(1, 1).align(SWT.FILL, SWT.CENTER).grab(false,
false)
+ final Button useLocalIpAddressButton = new Button(container, SWT.CHECK);
+ useLocalIpAddressButton.setText("Use '127.0.0.1' as the local address for
all Services");
+ GridDataFactory.fillDefaults().span(2, 1).align(SWT.FILL, SWT.CENTER).grab(false,
false)
.applyTo(useLocalIpAddressButton);
- IObservableValue useLocalIpAddressObservable = BeanProperties.value(
+ final IObservableValue useLocalIpAddressObservable = BeanProperties.value(
ApplicationPortForwardingWizardModel.PROPERTY_USE_DEFAULT_LOCAL_IP_ADDRESS).observe(wizardModel);
final IObservableValue useLocalIpAddressButtonSelection =
WidgetProperties.selection().observe(
useLocalIpAddressButton);
@@ -108,6 +111,36 @@
refreshViewerInput();
}
});
+
+ // checkbox to use the default "127.0.0.1" local IP address
+ final Button findFreesPortButton = new Button(container, SWT.CHECK);
+ findFreesPortButton.setText("Find free ports for all Services");
+ GridDataFactory.fillDefaults().span(2, 1).align(SWT.FILL, SWT.CENTER).grab(false,
false)
+ .applyTo(findFreesPortButton);
+ final IObservableValue findFreePortsButtonObservable = BeanProperties.value(
+ ApplicationPortForwardingWizardModel.PROPERTY_USE_FREE_PORTS).observe(wizardModel);
+ final IObservableValue findFreePortsButtonSelection =
WidgetProperties.selection().observe(
+ findFreesPortButton);
+ dbc.bindValue(findFreePortsButtonSelection, findFreePortsButtonObservable);
+ findFreePortsButtonObservable.addValueChangeListener(new IValueChangeListener() {
+ @Override
+ public void handleValueChange(ValueChangeEvent event) {
+ refreshViewerInput();
+ }
+ });
+
+ // enabling/disabling controls
+ IObservableValue portForwardingStartedObservable = BeanProperties.value(
+ ApplicationPortForwardingWizardModel.PROPERTY_PORT_FORWARDING).observe(wizardModel);
+ ValueBindingBuilder.bind(WidgetProperties.enabled().observe(startButton))
+ .notUpdating(portForwardingStartedObservable).converting(new
InvertingBooleanConverter()).in(dbc);
+ ValueBindingBuilder.bind(WidgetProperties.enabled().observe(stopButton))
+ .notUpdating(portForwardingStartedObservable).in(dbc);
+ ValueBindingBuilder.bind(WidgetProperties.enabled().observe(useLocalIpAddressButton))
+ .notUpdating(portForwardingStartedObservable).converting(new
InvertingBooleanConverter()).in(dbc);
+ ValueBindingBuilder.bind(WidgetProperties.enabled().observe(findFreesPortButton))
+ .notUpdating(portForwardingStartedObservable).converting(new
InvertingBooleanConverter()).in(dbc);
+
}
/*
@@ -128,6 +161,7 @@
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
+ verifyApplicationSSHSession();
wizardModel.refreshForwardablePorts();
refreshViewerInput();
} catch (Exception e) {
@@ -153,8 +187,7 @@
protected IStatus run(IProgressMonitor monitor) {
try {
verifyApplicationSSHSession();
- wizardModel.getApplication().startPortForwarding();
- wizardModel.getApplication().getForwardablePorts();
+ wizardModel.startPortForwarding();
refreshViewerInput();
} catch (Exception e) {
Logger.error("Failed to start port-forwarding", e);
@@ -187,7 +220,7 @@
protected IStatus run(IProgressMonitor monitor) {
try {
verifyApplicationSSHSession();
- wizardModel.getApplication().stopPortForwarding();
+ wizardModel.stopPortForwarding();
refreshViewerInput();
} catch (Exception e) {
Logger.error("Failed to stop Port-forwarding", e);
@@ -233,7 +266,7 @@
@Override
public void update(ViewerCell cell) {
IApplicationPortForwarding port = (IApplicationPortForwarding) cell.getElement();
- cell.setText(port.getLocalPort());
+ cell.setText(Integer.toString(port.getLocalPort()));
}
}, viewer, tableLayout);
@@ -249,7 +282,7 @@
@Override
public void update(ViewerCell cell) {
IApplicationPortForwarding port = (IApplicationPortForwarding) cell.getElement();
- cell.setText(port.getRemotePort());
+ cell.setText(Integer.toString(port.getRemotePort()));
}
}, viewer, tableLayout);
@@ -260,7 +293,7 @@
IApplicationPortForwarding port = (IApplicationPortForwarding) cell.getElement();
try {
final boolean started =
port.isStarted(wizardModel.getApplication().getSSHSession());
- cell.setText(started ? "Enabled" : "Disabled");
+ cell.setText(started ? "Started" : "Stopped");
} catch (OpenShiftSSHOperationException e) {
cell.setText("Unknown");
}
@@ -295,11 +328,11 @@
monitor.worked(1);
return Status.OK_STATUS;
} catch (Exception e) {
- return OpenShiftUIActivator.createErrorStatus("Could not load forwardable
ports for application", e);
+ return OpenShiftUIActivator.createErrorStatus(
+ "Could not load forwardable ports for application", e);
}
}
-
}, getContainer(), getDataBindingContext());
} catch (Exception e) {
// ignore
@@ -307,13 +340,14 @@
}
/**
- * @param monitor
+ * @param monitor
* @throws JSchException
*/
+ //TODO : move this method into the WizardModel ?
private void verifyApplicationSSHSession() throws JSchException {
final boolean hasSSHSession = wizardModel.getApplication().hasSSHSession();
- if(!hasSSHSession) {
- Logger.info("Opening a new SSH Session for application '" +
wizardModel.getApplication().getName() + "'");
+ if (!hasSSHSession) {
+ Logger.debug("Opening a new SSH Session for application '" +
wizardModel.getApplication().getName() + "'");
final Session session = OpenShiftSshSessionFactory.getInstance().createSession(
getSshUri(wizardModel.getApplication()));
wizardModel.getApplication().setSSHSession(session);