Add possibility to configure the timeouts for GitLabConnections (fixes #342)

This commit is contained in:
Robin Müller 2016-06-07 21:06:30 +02:00
parent 32ed183624
commit 3f92edbd22
9 changed files with 73 additions and 18 deletions

View File

@ -106,7 +106,9 @@ public class GitLabPushTrigger extends Trigger<Job<?, ?>> {
gitLabConfig.getConnections().add(new GitLabConnection(oldConfig.gitlabHostUrl,
oldConfig.gitlabHostUrl,
oldConfig.gitlabApiToken,
oldConfig.ignoreCertificateErrors));
oldConfig.ignoreCertificateErrors,
10,
10));
String defaultConnectionName = gitLabConfig.getConnections().get(0).getName();
for (AbstractProject<?, ?> project : Jenkins.getInstance().getAllItems(AbstractProject.class)) {

View File

@ -27,13 +27,17 @@ public class GitLabConnection {
// TODO make final when migration code gets removed
private String apiTokenId;
private final boolean ignoreCertificateErrors;
private final Integer connectionTimeout;
private final Integer readTimeout;
@DataBoundConstructor
public GitLabConnection(String name, String url, String apiTokenId, boolean ignoreCertificateErrors) {
public GitLabConnection(String name, String url, String apiTokenId, boolean ignoreCertificateErrors, Integer connectionTimeout, Integer readTimeout) {
this.name = name;
this.url = url;
this.apiTokenId = apiTokenId;
this.ignoreCertificateErrors = ignoreCertificateErrors;
this.connectionTimeout = connectionTimeout;
this.readTimeout = readTimeout;
}
public String getName() {
@ -52,6 +56,21 @@ public class GitLabConnection {
return ignoreCertificateErrors;
}
public int getConnectionTimeout() {
return connectionTimeout;
}
public int getReadTimeout() {
return readTimeout;
}
protected GitLabConnection readResolve() {
if (connectionTimeout == null || readTimeout == null) {
return new GitLabConnection(name, url, apiTokenId, ignoreCertificateErrors, 10, 10);
}
return this;
}
@Initializer(after = InitMilestone.PLUGINS_STARTED)
public static void migrate() throws IOException {
GitLabConnectionConfig descriptor = (GitLabConnectionConfig) Jenkins.getInstance().getDescriptor(GitLabConnectionConfig.class);

View File

@ -98,9 +98,29 @@ public class GitLabConnectionConfig extends GlobalConfiguration {
}
}
public FormValidation doTestConnection(@QueryParameter String url, @QueryParameter String apiTokenId, @QueryParameter boolean ignoreCertificateErrors) {
public FormValidation doCheckConnectionTimeout(@QueryParameter Integer value) {
if (value == null) {
return FormValidation.error(Messages.connectionTimeout_required());
} else {
return FormValidation.ok();
}
}
public FormValidation doCheckReadTimeout(@QueryParameter Integer value) {
if (value == null) {
return FormValidation.error(Messages.readTimeout_required());
} else {
return FormValidation.ok();
}
}
public FormValidation doTestConnection(@QueryParameter String url,
@QueryParameter String apiTokenId,
@QueryParameter boolean ignoreCertificateErrors,
@QueryParameter int connectionTimeout,
@QueryParameter int readTimeout) {
try {
GitLabClientBuilder.buildClient(url, apiTokenId, ignoreCertificateErrors).headCurrentUser();
GitLabClientBuilder.buildClient(url, apiTokenId, ignoreCertificateErrors, connectionTimeout, readTimeout).headCurrentUser();
return FormValidation.ok(Messages.connection_success());
} catch (WebApplicationException e) {
return FormValidation.error(Messages.connection_error(e.getMessage()));

View File

@ -49,7 +49,7 @@ public class GitLabClientBuilder {
private final static Logger LOGGER = Logger.getLogger(GitLabClientBuilder.class.getName());
private static final String PRIVATE_TOKEN = "PRIVATE-TOKEN";
public static GitLabApi buildClient(String gitlabHostUrl, final String gitlabApiTokenId, boolean ignoreCertificateErrors) {
public static GitLabApi buildClient(String gitlabHostUrl, final String gitlabApiTokenId, boolean ignoreCertificateErrors, int connectionTimeout, int readTimeout) {
ResteasyClientBuilder builder = new ResteasyClientBuilder();
if (ignoreCertificateErrors) {
builder.hostnameVerification(ResteasyClientBuilder.HostnameVerificationPolicy.ANY);
@ -58,8 +58,8 @@ public class GitLabClientBuilder {
return builder
.connectionPoolSize(60)
.maxPooledPerRoute(30)
.establishConnectionTimeout(10, TimeUnit.SECONDS)
.socketTimeout(10, TimeUnit.SECONDS)
.establishConnectionTimeout(connectionTimeout, TimeUnit.SECONDS)
.socketTimeout(readTimeout, TimeUnit.SECONDS)
.register(new JacksonJsonProvider())
.register(new JacksonConfig())
.register(new ApiHeaderTokenFilter(getApiToken(gitlabApiTokenId))).build().target(gitlabHostUrl)
@ -70,7 +70,11 @@ public class GitLabClientBuilder {
}
public static GitLabApi buildClient(GitLabConnection connection) {
return buildClient(connection.getUrl(), connection.getApiTokenId(), connection.isIgnoreCertificateErrors());
return buildClient(connection.getUrl(),
connection.getApiTokenId(),
connection.isIgnoreCertificateErrors(),
connection.getConnectionTimeout(),
connection.getReadTimeout());
}
@Initializer(before = InitMilestone.PLUGINS_STARTED)

View File

@ -1,5 +1,5 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form" xmlns:c="/lib/credentials">
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form" xmlns:c="/lib/credentials" xmlns:st="jelly:stapler">
<f:section title="Gitlab">
<f:entry title="${%GitLab connections}">
<f:repeatable var="connection" items="${descriptor.connections}" name="connections">
@ -14,9 +14,18 @@
<f:entry title="${%API Token}" field="apiTokenId" description="${%API Token for accessing Gitlab}">
<c:select/>
</f:entry>
<f:entry title="${%Ignore SSL Certificate Errors}" field="ignoreCertificateErrors">
<f:checkbox checked="${connection.ignoreCertificateErrors}"/>
</f:entry>
<f:advanced>
<f:entry title="${%Ignore SSL Certificate Errors}" field="ignoreCertificateErrors">
<f:checkbox checked="${connection.ignoreCertificateErrors}"/>
</f:entry>
<f:entry title="${%Connection timeout} (${%in seconds})" field="connectionTimeout" description="${%The time to wait for establishing the connection}">
<f:textbox value="${connection.connectionTimeout}" default="10"/>
</f:entry>
<f:entry title="${%Read timeout} (${%in seconds})" field="readTimeout" description="${%The time to wait while receiving the response}">
<f:textbox value="${connection.readTimeout}" default="10"/>
</f:entry>
<st:include page="configure-advanced.jelly" optional="true" />
</f:advanced>
<f:validateButton title="${%Test Connection}" progress="${%Testing...}" method="testConnection"
with="apiTokenId,url,ignoreCertificateErrors"/>
<f:entry title="">

View File

@ -2,5 +2,7 @@ name.required=Gitlab connection name required.
name.exists=GitLab connection name "{0}" already exists
url.required=Gitlab host URL required.
apiToken.required=API Token for Gitlab access required
connectionTimeout.required=Connection timeout is required
readTimeout.required=Read timeout is required
connection.success=Success
connection.error=Client error: {0}

View File

@ -86,7 +86,7 @@ public class GitLabConnectionConfigSSLTest {
public void doCheckConnection_ignoreCertificateErrors() {
GitLabConnectionConfig connectionConfig = jenkins.get(GitLabConnectionConfig.class);
FormValidation formValidation = connectionConfig.doTestConnection("https://localhost:" + port + "/gitlab", API_TOKEN_ID, true);
FormValidation formValidation = connectionConfig.doTestConnection("https://localhost:" + port + "/gitlab", API_TOKEN_ID, true, 10, 10);
assertThat(formValidation.getMessage(), is(Messages.connection_success()));
}
@ -94,7 +94,7 @@ public class GitLabConnectionConfigSSLTest {
public void doCheckConnection_certificateError() throws IOException {
GitLabConnectionConfig connectionConfig = jenkins.get(GitLabConnectionConfig.class);
FormValidation formValidation = connectionConfig.doTestConnection("https://localhost:" + port + "/gitlab", API_TOKEN_ID, false);
FormValidation formValidation = connectionConfig.doTestConnection("https://localhost:" + port + "/gitlab", API_TOKEN_ID, false, 10, 10);
assertThat(formValidation.getMessage(), containsString(Messages.connection_error("")));
}
}

View File

@ -59,7 +59,7 @@ public class GitLabConnectionConfigTest {
mockServerClient.when(request).respond(response().withStatusCode(Response.Status.OK.getStatusCode()));
GitLabConnectionConfig connectionConfig = jenkins.get(GitLabConnectionConfig.class);
FormValidation formValidation = connectionConfig.doTestConnection(gitLabUrl, API_TOKEN_ID, false);
FormValidation formValidation = connectionConfig.doTestConnection(gitLabUrl, API_TOKEN_ID, false, 10, 10);
assertThat(formValidation.getMessage(), is(Messages.connection_success()));
mockServerClient.verify(request);
@ -71,7 +71,7 @@ public class GitLabConnectionConfigTest {
mockServerClient.when(request).respond(response().withStatusCode(Response.Status.FORBIDDEN.getStatusCode()));
GitLabConnectionConfig connectionConfig = jenkins.get(GitLabConnectionConfig.class);
FormValidation formValidation = connectionConfig.doTestConnection(gitLabUrl, API_TOKEN_ID, false);
FormValidation formValidation = connectionConfig.doTestConnection(gitLabUrl, API_TOKEN_ID, false, 10, 10);
assertThat(formValidation.getMessage(), is(Messages.connection_error("HTTP 403 Forbidden")));
mockServerClient.verify(request);

View File

@ -21,7 +21,6 @@ import hudson.plugins.git.util.Build;
import hudson.plugins.git.util.BuildData;
import hudson.util.Secret;
import jenkins.model.Jenkins;
import org.apache.commons.io.IOUtils;
import org.eclipse.jgit.lib.ObjectId;
import org.hamcrest.CoreMatchers;
@ -86,7 +85,7 @@ public class GitLabCommitStatusPublisherTest {
new StringCredentialsImpl(CredentialsScope.SYSTEM, apiTokenId, "GitLab API Token", Secret.fromString(API_TOKEN)));
}
}
connectionConfig.addConnection(new GitLabConnection(GIT_LAB_CONNECTION, "http://localhost:" + mockServer.getPort() + "/gitlab", apiTokenId, false));
connectionConfig.addConnection(new GitLabConnection(GIT_LAB_CONNECTION, "http://localhost:" + mockServer.getPort() + "/gitlab", apiTokenId, false, 10, 10));
}
@After