From d49d108fa7f7502352138d771b3c632b3e397a5d Mon Sep 17 00:00:00 2001 From: Sumeet Wilkhu Date: Thu, 19 Sep 2019 14:04:17 -0400 Subject: [PATCH 1/2] Adding changes to accomodate to situation when kubernetes API server is behind firewall --- .../kubernetes/KubectlBuildWrapper.java | 23 +++++++++++++++---- .../kubernetes/KubernetesClientProvider.java | 2 +- .../plugins/kubernetes/KubernetesCloud.java | 14 ++++++++++- .../kubernetes/KubernetesFactoryAdapter.java | 19 ++++++++++----- .../KubectlBuildWrapper/config.jelly | 4 ++++ .../KubectlBuildWrapper/help-https_proxy.html | 3 +++ .../kubernetes/KubernetesCloud/config.jelly | 6 ++++- .../KubernetesCloud/help-https_proxy.html | 3 +++ 8 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html create mode 100644 src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java index fec3e43c7e..205ead1711 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java @@ -68,13 +68,15 @@ public class KubectlBuildWrapper extends SimpleBuildWrapper { private final String serverUrl; private final String credentialsId; private final String caCertificate; + private final String https_proxy; @DataBoundConstructor public KubectlBuildWrapper(@Nonnull String serverUrl, @Nonnull String credentialsId, - @Nonnull String caCertificate) { + @Nonnull String caCertificate, String https_proxy) { this.serverUrl = serverUrl; this.credentialsId = credentialsId; this.caCertificate = caCertificate; + this.https_proxy = https_proxy; } public String getServerUrl() { @@ -89,6 +91,10 @@ public String getCaCertificate() { return caCertificate; } + public String getHttps_proxy() { + return https_proxy; + } + @Override public void setUp(Context context, Run build, FilePath workspace, Launcher launcher, TaskListener listener, EnvVars initialEnvironment) throws IOException, InterruptedException { @@ -99,6 +105,7 @@ public void setUp(Context context, Run build, FilePath workspace, Launcher context.setDisposer(new CleanupDisposer(tempFiles)); String tlsConfig; + String kubectlBegin = ""; if (caCertificate != null && !caCertificate.isEmpty()) { FilePath caCrtFile = workspace.createTempFile("cert-auth", "crt"); String ca = caCertificate; @@ -113,8 +120,14 @@ public void setUp(Context context, Run build, FilePath workspace, Launcher tlsConfig = " --insecure-skip-tls-verify=true"; } + if(this.https_proxy != null && !https_proxy.isEmpty()) { + kubectlBegin += "HTTPS_PROXY="+this.https_proxy+" kubectl config --kubeconfig=\""; + } else { + kubectlBegin += "kubectl config --kubeconfig=\""; + } + int status = launcher.launch() - .cmdAsSingleString("kubectl config --kubeconfig=\"" + configFile.getRemote() + .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-cluster k8s --server=" + serverUrl + tlsConfig) .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); @@ -174,18 +187,18 @@ public void setUp(Context context, Run build, FilePath workspace, Launcher } status = launcher.launch() - .cmdAsSingleString("kubectl config --kubeconfig=\"" + configFile.getRemote() + "\" set-credentials cluster-admin " + login) + .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-credentials cluster-admin " + login) .masks(false, false, false, false, false, false, true) .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); status = launcher.launch() - .cmdAsSingleString("kubectl config --kubeconfig=\"" + configFile.getRemote() + "\" set-context k8s --cluster=k8s --user=cluster-admin") + .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-context k8s --cluster=k8s --user=cluster-admin") .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); status = launcher.launch() - .cmdAsSingleString("kubectl config --kubeconfig=\"" + configFile.getRemote() + "\" use-context k8s") + .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" use-context k8s") .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); } diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java index a05ba0fac5..35486531f8 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java @@ -92,7 +92,7 @@ static KubernetesClient createClient(KubernetesCloud cloud) throws NoSuchAlgorit String displayName = cloud.getDisplayName(); final Client c = clients.getIfPresent(displayName); if (c == null) { - KubernetesClient client = new KubernetesFactoryAdapter(cloud.getServerUrl(), cloud.getNamespace(), + KubernetesClient client = new KubernetesFactoryAdapter(cloud.getServerUrl(), cloud.getHttps_proxy(), cloud.getNamespace(), cloud.getServerCertificate(), cloud.getCredentialsId(), cloud.isSkipTlsVerify(), cloud.getConnectTimeout(), cloud.getReadTimeout(), cloud.getMaxRequestsPerHost()).createClient(); clients.put(displayName, new Client(getValidity(cloud), client)); diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java index e29d837753..6c67366f63 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java @@ -98,6 +98,7 @@ public class KubernetesCloud extends Cloud { @Nonnull private List templates = new ArrayList<>(); private String serverUrl; + private String https_proxy; @CheckForNull private String serverCertificate; @@ -148,6 +149,7 @@ public KubernetesCloud(@NonNull String name, @NonNull KubernetesCloud source) { this.defaultsProviderTemplate = source.defaultsProviderTemplate; this.templates.addAll(source.templates); this.serverUrl = source.serverUrl; + this.https_proxy = source.https_proxy; this.skipTlsVerify = source.skipTlsVerify; this.addMasterProxyEnvVars = source.addMasterProxyEnvVars; this.namespace = source.namespace; @@ -248,6 +250,15 @@ public void setServerUrl(@Nonnull String serverUrl) { this.serverUrl = serverUrl; } + public String getHttps_proxy() { + return https_proxy; + } + + @DataBoundSetter + public void setHttps_proxy(@Nonnull String https_proxy) { + this.https_proxy = https_proxy; + } + public String getServerCertificate() { return serverCertificate; } @@ -731,6 +742,7 @@ public FormValidation doTestConnection(@QueryParameter String name, @QueryParame @QueryParameter String serverCertificate, @QueryParameter boolean skipTlsVerify, @QueryParameter String namespace, + @QueryParameter String https_proxy, @QueryParameter int connectionTimeout, @QueryParameter int readTimeout) throws Exception { Jenkins.get().checkPermission(Jenkins.ADMINISTER); @@ -738,7 +750,7 @@ public FormValidation doTestConnection(@QueryParameter String name, @QueryParame if (StringUtils.isBlank(name)) return FormValidation.error("name is required"); - try (KubernetesClient client = new KubernetesFactoryAdapter(serverUrl, namespace, + try (KubernetesClient client = new KubernetesFactoryAdapter(serverUrl, https_proxy, namespace, Util.fixEmpty(serverCertificate), Util.fixEmpty(credentialsId), skipTlsVerify, connectionTimeout, readTimeout).createClient()) { // test listing pods diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java index 150c7ba796..99d60782c7 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java @@ -71,23 +71,24 @@ public class KubernetesFactoryAdapter { private final int connectTimeout; private final int readTimeout; private final int maxRequestsPerHost; + private final String https_proxy; public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify) { - this(serviceAddress, null, caCertData, credentials, skipTlsVerify); + this(serviceAddress, null, null, caCertData, credentials, skipTlsVerify); } - public KubernetesFactoryAdapter(String serviceAddress, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify) { - this(serviceAddress, namespace, caCertData, credentials, skipTlsVerify, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT); + this(serviceAddress, https_proxy, namespace, caCertData, credentials, skipTlsVerify, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT); } - public KubernetesFactoryAdapter(String serviceAddress, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify, int connectTimeout, int readTimeout) { - this(serviceAddress, namespace, caCertData, credentials, skipTlsVerify, connectTimeout, readTimeout, KubernetesCloud.DEFAULT_MAX_REQUESTS_PER_HOST); + this(serviceAddress, https_proxy, namespace, caCertData, credentials, skipTlsVerify, connectTimeout, readTimeout, KubernetesCloud.DEFAULT_MAX_REQUESTS_PER_HOST); } - public KubernetesFactoryAdapter(String serviceAddress, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify, int connectTimeout, int readTimeout, int maxRequestsPerHost) { this.serviceAddress = serviceAddress; this.namespace = namespace; @@ -97,6 +98,7 @@ public KubernetesFactoryAdapter(String serviceAddress, String namespace, @CheckF this.connectTimeout = connectTimeout; this.readTimeout = readTimeout; this.maxRequestsPerHost = maxRequestsPerHost; + this.https_proxy = https_proxy != null && !https_proxy.isEmpty() ? https_proxy : null; } private StandardCredentials getCredentials(String credentials) { @@ -171,6 +173,11 @@ public KubernetesClient createClient() throws NoSuchAlgorithmException, Unrecove builder = builder.withRequestTimeout(readTimeout * 1000).withConnectionTimeout(connectTimeout * 1000); builder.withMaxConcurrentRequestsPerHost(maxRequestsPerHost); + if(https_proxy != null && !https_proxy.isEmpty()) { + LOGGER.info("Http proxy used is " + https_proxy); + builder.withHttpsProxy(https_proxy); + } + if (!StringUtils.isBlank(namespace)) { builder.withNamespace(namespace); } else if (StringUtils.isBlank(builder.getNamespace())) { diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly index ea2d5fb3d1..deb4934273 100644 --- a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly @@ -5,6 +5,10 @@ + + + + diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html new file mode 100644 index 0000000000..f97b17e805 --- /dev/null +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html @@ -0,0 +1,3 @@ +
+ Use proxy when kubernetes api server is behind the firewall. +
\ No newline at end of file diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly index e5e5ced341..9bb7a37d4d 100644 --- a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly @@ -9,6 +9,10 @@ + + + + @@ -25,7 +29,7 @@ - + diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html new file mode 100644 index 0000000000..f97b17e805 --- /dev/null +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html @@ -0,0 +1,3 @@ +
+ Use proxy when kubernetes api server is behind the firewall. +
\ No newline at end of file From 08f696e9e83cced9244098bba5ed1d1edb352897 Mon Sep 17 00:00:00 2001 From: Sumeet Wilkhu Date: Thu, 26 Sep 2019 02:11:33 -0400 Subject: [PATCH 2/2] Adding changes based on recommendations from reviewer(s) --- .../kubernetes/KubectlBuildWrapper.java | 24 +++++------ .../kubernetes/KubernetesClientProvider.java | 2 +- .../plugins/kubernetes/KubernetesCloud.java | 16 ++++---- .../kubernetes/KubernetesFactoryAdapter.java | 20 +++++----- .../KubectlBuildWrapper/config.jelly | 2 +- ...-https_proxy.html => help-httpsProxy.html} | 0 .../kubernetes/KubernetesCloud/config.jelly | 4 +- ...-https_proxy.html => help-httpsProxy.html} | 0 .../KubernetesClientProviderTest.java | 40 +++++++++++++++++++ 9 files changed, 72 insertions(+), 36 deletions(-) rename src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/{help-https_proxy.html => help-httpsProxy.html} (100%) rename src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/{help-https_proxy.html => help-httpsProxy.html} (100%) create mode 100644 src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProviderTest.java diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java index 205ead1711..b55442c7a4 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper.java @@ -68,15 +68,15 @@ public class KubectlBuildWrapper extends SimpleBuildWrapper { private final String serverUrl; private final String credentialsId; private final String caCertificate; - private final String https_proxy; + private final String httpsProxy; @DataBoundConstructor public KubectlBuildWrapper(@Nonnull String serverUrl, @Nonnull String credentialsId, - @Nonnull String caCertificate, String https_proxy) { + @Nonnull String caCertificate, String httpsProxy) { this.serverUrl = serverUrl; this.credentialsId = credentialsId; this.caCertificate = caCertificate; - this.https_proxy = https_proxy; + this.httpsProxy = httpsProxy; } public String getServerUrl() { @@ -91,8 +91,8 @@ public String getCaCertificate() { return caCertificate; } - public String getHttps_proxy() { - return https_proxy; + public String getHttpsProxy() { + return httpsProxy; } @Override @@ -120,13 +120,9 @@ public void setUp(Context context, Run build, FilePath workspace, Launcher tlsConfig = " --insecure-skip-tls-verify=true"; } - if(this.https_proxy != null && !https_proxy.isEmpty()) { - kubectlBegin += "HTTPS_PROXY="+this.https_proxy+" kubectl config --kubeconfig=\""; - } else { - kubectlBegin += "kubectl config --kubeconfig=\""; - } + kubectlBegin += "kubectl config --kubeconfig=\""; - int status = launcher.launch() + int status = launcher.launch().envs("HTTPS_PROXY="+this.httpsProxy) .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-cluster k8s --server=" + serverUrl + tlsConfig) .join(); @@ -186,18 +182,18 @@ public void setUp(Context context, Run build, FilePath workspace, Launcher throw new AbortException("Unsupported Credentials type " + c.getClass().getName()); } - status = launcher.launch() + status = launcher.launch().envs("HTTPS_PROXY="+this.httpsProxy) .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-credentials cluster-admin " + login) .masks(false, false, false, false, false, false, true) .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); - status = launcher.launch() + status = launcher.launch().envs("HTTPS_PROXY="+this.httpsProxy) .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" set-context k8s --cluster=k8s --user=cluster-admin") .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); - status = launcher.launch() + status = launcher.launch().envs("HTTPS_PROXY="+this.httpsProxy) .cmdAsSingleString(kubectlBegin + configFile.getRemote() + "\" use-context k8s") .join(); if (status != 0) throw new IOException("Failed to run kubectl config "+status); diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java index 35486531f8..7b12c847fd 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProvider.java @@ -92,7 +92,7 @@ static KubernetesClient createClient(KubernetesCloud cloud) throws NoSuchAlgorit String displayName = cloud.getDisplayName(); final Client c = clients.getIfPresent(displayName); if (c == null) { - KubernetesClient client = new KubernetesFactoryAdapter(cloud.getServerUrl(), cloud.getHttps_proxy(), cloud.getNamespace(), + KubernetesClient client = new KubernetesFactoryAdapter(cloud.getServerUrl(), cloud.getHttpsProxy(), cloud.getNamespace(), cloud.getServerCertificate(), cloud.getCredentialsId(), cloud.isSkipTlsVerify(), cloud.getConnectTimeout(), cloud.getReadTimeout(), cloud.getMaxRequestsPerHost()).createClient(); clients.put(displayName, new Client(getValidity(cloud), client)); diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java index 6c67366f63..623ad9c205 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud.java @@ -98,7 +98,7 @@ public class KubernetesCloud extends Cloud { @Nonnull private List templates = new ArrayList<>(); private String serverUrl; - private String https_proxy; + private String httpsProxy; @CheckForNull private String serverCertificate; @@ -149,7 +149,7 @@ public KubernetesCloud(@NonNull String name, @NonNull KubernetesCloud source) { this.defaultsProviderTemplate = source.defaultsProviderTemplate; this.templates.addAll(source.templates); this.serverUrl = source.serverUrl; - this.https_proxy = source.https_proxy; + this.httpsProxy = source.httpsProxy; this.skipTlsVerify = source.skipTlsVerify; this.addMasterProxyEnvVars = source.addMasterProxyEnvVars; this.namespace = source.namespace; @@ -250,13 +250,13 @@ public void setServerUrl(@Nonnull String serverUrl) { this.serverUrl = serverUrl; } - public String getHttps_proxy() { - return https_proxy; + public String getHttpsProxy() { + return httpsProxy; } @DataBoundSetter - public void setHttps_proxy(@Nonnull String https_proxy) { - this.https_proxy = https_proxy; + public void setHttpsProxy(@Nonnull String httpsProxy) { + this.httpsProxy = httpsProxy; } public String getServerCertificate() { @@ -742,7 +742,7 @@ public FormValidation doTestConnection(@QueryParameter String name, @QueryParame @QueryParameter String serverCertificate, @QueryParameter boolean skipTlsVerify, @QueryParameter String namespace, - @QueryParameter String https_proxy, + @QueryParameter String httpsProxy, @QueryParameter int connectionTimeout, @QueryParameter int readTimeout) throws Exception { Jenkins.get().checkPermission(Jenkins.ADMINISTER); @@ -750,7 +750,7 @@ public FormValidation doTestConnection(@QueryParameter String name, @QueryParame if (StringUtils.isBlank(name)) return FormValidation.error("name is required"); - try (KubernetesClient client = new KubernetesFactoryAdapter(serverUrl, https_proxy, namespace, + try (KubernetesClient client = new KubernetesFactoryAdapter(serverUrl, httpsProxy, namespace, Util.fixEmpty(serverCertificate), Util.fixEmpty(credentialsId), skipTlsVerify, connectionTimeout, readTimeout).createClient()) { // test listing pods diff --git a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java index 99d60782c7..2c5845d75f 100644 --- a/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java +++ b/src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesFactoryAdapter.java @@ -71,24 +71,24 @@ public class KubernetesFactoryAdapter { private final int connectTimeout; private final int readTimeout; private final int maxRequestsPerHost; - private final String https_proxy; + private final String httpsProxy; public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify) { this(serviceAddress, null, null, caCertData, credentials, skipTlsVerify); } - public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String httpsProxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify) { - this(serviceAddress, https_proxy, namespace, caCertData, credentials, skipTlsVerify, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT); + this(serviceAddress, httpsProxy, namespace, caCertData, credentials, skipTlsVerify, DEFAULT_CONNECT_TIMEOUT, DEFAULT_READ_TIMEOUT); } - public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String httpsProxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify, int connectTimeout, int readTimeout) { - this(serviceAddress, https_proxy, namespace, caCertData, credentials, skipTlsVerify, connectTimeout, readTimeout, KubernetesCloud.DEFAULT_MAX_REQUESTS_PER_HOST); + this(serviceAddress, httpsProxy, namespace, caCertData, credentials, skipTlsVerify, connectTimeout, readTimeout, KubernetesCloud.DEFAULT_MAX_REQUESTS_PER_HOST); } - public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String https_proxy, String namespace, @CheckForNull String caCertData, + public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String httpsProxy, String namespace, @CheckForNull String caCertData, @CheckForNull String credentials, boolean skipTlsVerify, int connectTimeout, int readTimeout, int maxRequestsPerHost) { this.serviceAddress = serviceAddress; this.namespace = namespace; @@ -98,7 +98,7 @@ public KubernetesFactoryAdapter(String serviceAddress, @CheckForNull String http this.connectTimeout = connectTimeout; this.readTimeout = readTimeout; this.maxRequestsPerHost = maxRequestsPerHost; - this.https_proxy = https_proxy != null && !https_proxy.isEmpty() ? https_proxy : null; + this.httpsProxy = httpsProxy != null && !httpsProxy.isEmpty() ? httpsProxy : null; } private StandardCredentials getCredentials(String credentials) { @@ -173,9 +173,9 @@ public KubernetesClient createClient() throws NoSuchAlgorithmException, Unrecove builder = builder.withRequestTimeout(readTimeout * 1000).withConnectionTimeout(connectTimeout * 1000); builder.withMaxConcurrentRequestsPerHost(maxRequestsPerHost); - if(https_proxy != null && !https_proxy.isEmpty()) { - LOGGER.info("Http proxy used is " + https_proxy); - builder.withHttpsProxy(https_proxy); + if(httpsProxy != null && !httpsProxy.isEmpty()) { + LOGGER.info("Https Proxy used is " + httpsProxy); + builder.withHttpsProxy(httpsProxy); } if (!StringUtils.isBlank(namespace)) { diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly index deb4934273..ea5f2a46e1 100644 --- a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/config.jelly @@ -5,7 +5,7 @@
- + diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-httpsProxy.html similarity index 100% rename from src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-https_proxy.html rename to src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubectlBuildWrapper/help-httpsProxy.html diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly index 9bb7a37d4d..433d5411b8 100644 --- a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly +++ b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly @@ -9,7 +9,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html b/src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-httpsProxy.html similarity index 100% rename from src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-https_proxy.html rename to src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/help-httpsProxy.html diff --git a/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProviderTest.java b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProviderTest.java new file mode 100644 index 0000000000..989fcb8aa4 --- /dev/null +++ b/src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesClientProviderTest.java @@ -0,0 +1,40 @@ +package org.csanchez.jenkins.plugins.kubernetes; + +import io.fabric8.kubernetes.client.KubernetesClient; +import org.junit.Before; +import org.junit.Test; +import static io.fabric8.kubernetes.client.Config.*; +import static org.junit.Assert.assertEquals; + +/** + * Test the creation of client with httpsProxy + */ +public class KubernetesClientProviderTest { + private static final String HTTPS_PROXY = "https://example.com:123"; + private static final String DEFAULT_HTTPS_PROXY = "https://example.com:1234"; + + @Before + public void injectEnvironmentVariables() { + System.setProperty(KUBERNETES_HTTPS_PROXY, DEFAULT_HTTPS_PROXY); + } + @Test + public void testHttpsProxyInjection() throws Exception { + KubernetesFactoryAdapter factory = new KubernetesFactoryAdapter("http://example.com", HTTPS_PROXY, null, null, null, false, 1, 1, 1); + KubernetesClient client = factory.createClient(); + assertEquals(HTTPS_PROXY, client.getConfiguration().getHttpsProxy()); + } + + @Test + public void testDefaultHttpsProxyInjection() throws Exception { + KubernetesFactoryAdapter factory = new KubernetesFactoryAdapter("http://example.com", null, null, null, null, false, 1, 1, 1); + KubernetesClient client = factory.createClient(); + assertEquals(DEFAULT_HTTPS_PROXY, client.getConfiguration().getHttpsProxy()); + } + + @Test + public void testEmptyHttpsProxyInjection() throws Exception { + KubernetesFactoryAdapter factory = new KubernetesFactoryAdapter("http://example.com", "", null, null, null, false, 1, 1, 1); + KubernetesClient client = factory.createClient(); + assertEquals(DEFAULT_HTTPS_PROXY, client.getConfiguration().getHttpsProxy()); + } +}