Bug 494521 - NPE when New Docker Connection dialog is open on Windows
Prevent returning connection settings when the DOCKER_HOST
environment variable was not found.
On environments where Docker Toolbox was installed, there
might not be any DOCKER_HOST, etc. env variables set, but there
is a 'DOCKER_TOOLBOX_INSTALL_PATH' env var, which means that
the exit code of the script is '0' and from there, the
'createDockerConnectionSettings' is called.
This method noew returns 'null' if the DOCKER_HOST property
is missing.
Change-Id: Ia19b31782fcd714b9c6549b01801129f5295936f
Signed-off-by: Xavier Coulon <xcoulon@redhat.com>
Reviewed-on: https://git.eclipse.org/r/73588
Tested-by: Hudson CI
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
diff --git a/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
index ca3be3b..1b33213 100644
--- a/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
+++ b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinder.java
@@ -141,7 +141,9 @@
try {
final DockerClient client = new DockerClientFactory()
.getClient(connectionSettings);
- return client.info().name();
+ if (client != null) {
+ return client.info().name();
+ }
} catch (DockerCertificateException
| com.spotify.docker.client.DockerException
| InterruptedException e) {
@@ -239,14 +241,27 @@
return null;
}
+ /**
+ * Creates connection settings from the given {@code docerSettings}, or
+ * <code>null</code> if the settings did not contain a property with the
+ * {@code DOCKER_HOST} key.
+ *
+ * @param dockerSettings
+ * the connection settings
+ * @return the {@link IDockerConnectionSettings} or <code>null</code> if the
+ * settings are invalid.
+ */
public IDockerConnectionSettings createDockerConnectionSettings(
final Properties dockerSettings) {
final Object dockerHostEnvVariable = dockerSettings.get(DOCKER_HOST);
final Object dockerCertPathEnvVariable = dockerSettings
.get(DOCKER_CERT_PATH);
+ // at least 'dockerHostEnvVariable' should be not null
+ if (dockerHostEnvVariable == null) {
+ return null;
+ }
return new TCPConnectionSettings(
- dockerHostEnvVariable != null
- ? dockerHostEnvVariable.toString() : null,
+ dockerHostEnvVariable.toString(),
dockerCertPathEnvVariable != null
? dockerCertPathEnvVariable.toString() : null);
}
@@ -308,11 +323,11 @@
* *Nix) or <code>null</code> if the current OS is not supported.
*/
private String getConnectionSettingsDetectionScriptName() {
- if (Platform.getOS().equals(Platform.OS_LINUX)) {
+ if (SystemUtils.isLinux()) {
return "script.sh";//$NON-NLS-1$
- } else if (Platform.getOS().equals(Platform.OS_MACOSX)) {
+ } else if (SystemUtils.isMac()) {
return "script-macosx.sh";//$NON-NLS-1$
- } else if (Platform.getOS().equals(Platform.OS_WIN32)) {
+ } else if (SystemUtils.isWindows()) {
return "script.bat"; //$NON-NLS-1$
}
return null;
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
similarity index 95%
rename from containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java
rename to containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
index b0524e1..344da21 100644
--- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/utils/SystemUtils.java
+++ b/containers/org.eclipse.linuxtools.docker.core/src/org/eclipse/linuxtools/internal/docker/core/SystemUtils.java
@@ -9,7 +9,7 @@
* Red Hat - Initial Contribution
*******************************************************************************/
-package org.eclipse.linuxtools.internal.docker.ui.utils;
+package org.eclipse.linuxtools.internal.docker.core;
import org.eclipse.core.runtime.Platform;
diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
index 030cb63..8aea4ae 100644
--- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
+++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/core/DefaultDockerConnectionSettingsFinderSWTBotTest.java
@@ -42,4 +42,17 @@
assertThat(((TCPConnectionSettings)connectionSettings).isTlsVerify()).isTrue();
}
+ @Test
+ public void shouldNotCreateConnectionSettingsWhenMissingHost() {
+ // given
+ final Properties properties = new Properties();
+ properties.setProperty(DefaultDockerConnectionSettingsFinder.DOCKER_CERT_PATH, "/path/to/certs");
+ // actually, the DOCKER_TLS_VERIFY is not used. If DOCKER_CERT_PATH is set, the we assume that DOCKER_TLS_VERIFY is '1'
+ //properties.setProperty(DefaultDockerConnectionSettingsFinder.DOCKER_TLS_VERIFY, "1");
+ // when
+ final IDockerConnectionSettings connectionSettings = new DefaultDockerConnectionSettingsFinder().createDockerConnectionSettings(properties);
+ // then
+ assertThat(connectionSettings).isNull();
+ }
+
}
diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
index edef18e..ae6e215 100644
--- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
+++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/preferences/PreferenceInitializer.java
@@ -19,7 +19,7 @@
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.linuxtools.docker.ui.Activator;
-import org.eclipse.linuxtools.internal.docker.ui.utils.SystemUtils;
+import org.eclipse.linuxtools.internal.docker.core.SystemUtils;
/**
* Class used to initialize default preference values.