Skip to content

Commit

Permalink
fix #215 Read timed out: Add socket and connection timeout to Configu…
Browse files Browse the repository at this point in the history
…ration (default 10 sec.)
  • Loading branch information
MCMicS committed May 27, 2020
1 parent 635ec5c commit 85a7177
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 71 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
Version 0.13.3
* add GoTo Allure report
* #213 NodeParameterDefinition is unsupported
* #215 Read timed out: Add socket and connection timeout to Configuration (default 10 sec.)

Version 0.13.2
* #64: NumberFormatException on start of IntelliJ
Expand Down
1 change: 1 addition & 0 deletions includes/pluginChanges.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ <h3>0.13.3</h3>
<ul>
<li>add GoTo Allure report</li>
<li>#213 NodeParameterDefinition is unsupported</li>
<li>#215 Read timed out: Add socket and connection timeout to Configuration (default 10 sec.)</li>
</ul>
<h3>0.13.2</h3>
<ul>
Expand Down
66 changes: 45 additions & 21 deletions src/main/java/org/codinjutsu/tools/jenkins/JenkinsSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@

import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;

@State(
name = "Jenkins.Settings",
Expand Down Expand Up @@ -64,19 +65,19 @@ public void loadState(@NotNull State state) {
}

public String getUsername() {
return myState.username;
return myState.getUsername();
}

public void setUsername(String username) {
myState.username = username;
myState.setUsername(username);
}

public String getCrumbData() {
return myState.crumbData;
return myState.getCrumbData();
}

public void setCrumbData(String crumbData) {
myState.crumbData = crumbData;
myState.setCrumbData(crumbData);
}

public String getPassword() {
Expand All @@ -95,70 +96,93 @@ private CredentialAttributes getPasswordCredentialAttributes() {
}

public void addFavorite(@NotNull List<Job> jobs) {
jobs.stream().map(JobUtil::createFavoriteJob).forEach(myState.favoriteJobs::add);
jobs.stream().map(JobUtil::createFavoriteJob).forEach(myState::addFavoriteJobs);
}

public boolean isFavoriteJob(@NotNull Job job) {
return myState.favoriteJobs.stream().anyMatch(favoriteJob -> JobUtil.isFavoriteJob(job, favoriteJob));
return myState.getFavoriteJobs().stream().anyMatch(favoriteJob -> JobUtil.isFavoriteJob(job, favoriteJob));
}

public void removeFavorite(@NotNull List<Job> selectedJobs) {
selectedJobs.forEach(jobToRemove -> myState.favoriteJobs.removeIf(
selectedJobs.forEach(jobToRemove -> myState.removeFavoriteJob(
favoriteJob -> JobUtil.isFavoriteJob(jobToRemove, favoriteJob))
);
}

@NotNull
public List<FavoriteJob> getFavoriteJobs() {
return myState.favoriteJobs;
return myState.getFavoriteJobs();
}

public boolean isFavoriteViewEmpty() {
return myState.favoriteJobs.isEmpty();
return myState.getFavoriteJobs().isEmpty();
}

public String getLastSelectedView() {
return myState.lastSelectedView;
return myState.getLastSelectedView();
}

public void setLastSelectedView(String viewName) {
myState.lastSelectedView = viewName;
myState.setLastSelectedView(viewName);
}

public boolean isSecurityMode() {
return StringUtils.isNotBlank(getUsername());
}

public JenkinsVersion getVersion() {
return this.myState.jenkinsVersion;
return this.myState.getJenkinsVersion();
}

public void setVersion(JenkinsVersion jenkinsVersion) {
this.myState.jenkinsVersion = jenkinsVersion;
this.myState.setJenkinsVersion(jenkinsVersion);
}

public void clearFavoriteJobs() {
myState.favoriteJobs.clear();
myState.clearFavoriteJobs();
}

public boolean hasFavoriteJobs() {
return !myState.favoriteJobs.isEmpty();
return !myState.getFavoriteJobs().isEmpty();
}

public static class State {
public int getConnectionTimeout() {
return myState.getConnectionTimeout();
}

public void setConnectionTimeout(int timeoutInSeconds) {
myState.setConnectionTimeout(timeoutInSeconds);
}

@Data
public static class State {
public static final String RESET_STR_VALUE = "";

public String username = RESET_STR_VALUE;
private static final int DEFAULT_CONNECTION_TIMEOUT = 10;

private String username = RESET_STR_VALUE;

public String crumbData = RESET_STR_VALUE;
private String crumbData = RESET_STR_VALUE;

public String lastSelectedView;
private String lastSelectedView;

public List<FavoriteJob> favoriteJobs = new LinkedList<>();
private List<FavoriteJob> favoriteJobs = new LinkedList<>();

public JenkinsVersion jenkinsVersion = JenkinsVersion.VERSION_1;
private JenkinsVersion jenkinsVersion = JenkinsVersion.VERSION_1;

private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;

public void clearFavoriteJobs() {
favoriteJobs.clear();
}

public void addFavoriteJobs(FavoriteJob favoriteJob) {
favoriteJobs.add(favoriteJob);
}

public void removeFavoriteJob(Predicate<? super FavoriteJob> filter) {
favoriteJobs.removeIf(filter);
}
}

@AllArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ private List<Job> withNestedJobs(@NotNull List<Job> jobs) {
/**
* @deprecated 2020-05-26 remove if NodeParameter implement choices API
*/
@Deprecated
@Deprecated(since = "0.13.3")
@NotNull
private List<Job> withNodeParameterFix(@NotNull List<Job> jobs) {
final AtomicReference<List<Computer>> computers = new AtomicReference<>();
Expand All @@ -170,7 +170,7 @@ private List<Job> withNodeParameterFix(@NotNull List<Job> jobs) {
/**
* @deprecated 2020-05-26 remove if NodeParameter implement choices API
*/
@Deprecated
@Deprecated(since = "0.13.3")
@NotNull
private Job withNodeParameterFix(@NotNull Job job, @NotNull Supplier<Collection<Computer>> computers) {
final boolean fixJob = job.getParameters().stream().map(JobParameter::getJobParameterType)
Expand Down Expand Up @@ -286,25 +286,30 @@ public void runParameterizedBuild(Job job, JenkinsAppSettings configuration, Map
@Override
public void authenticate(JenkinsAppSettings jenkinsAppSettings, JenkinsSettings jenkinsSettings) {
SecurityClientFactory.setVersion(jenkinsSettings.getVersion());
final int connectionTimout = getConnectionTimout(jenkinsSettings.getConnectionTimeout());
if (jenkinsSettings.isSecurityMode()) {
securityClient = SecurityClientFactory.basic(jenkinsSettings.getUsername(), jenkinsSettings.getPassword(), jenkinsSettings.getCrumbData());
securityClient = SecurityClientFactory.basic(jenkinsSettings.getUsername(), jenkinsSettings.getPassword(),
jenkinsSettings.getCrumbData(), connectionTimout);
} else {
securityClient = SecurityClientFactory.none(jenkinsSettings.getCrumbData());
securityClient = SecurityClientFactory.none(jenkinsSettings.getCrumbData(), connectionTimout);
}
securityClient.connect(urlBuilder.createAuthenticationUrl(jenkinsAppSettings.getServerUrl()));

jenkinsServer = new JenkinsServer(urlBuilder.createServerUrl(jenkinsAppSettings.getServerUrl()), jenkinsSettings.getUsername(), jenkinsSettings.getPassword());
}

@Override
public void authenticate(String serverUrl, String username, String password, String crumbData, JenkinsVersion version) {
public void testAuthenticate(String serverUrl, String username, String password, String crumbData, JenkinsVersion version,
int connectionTimoutInSeconds) {
SecurityClientFactory.setVersion(version);
final int connectionTimout = getConnectionTimout(connectionTimoutInSeconds);
final SecurityClient securityClientForTest;
if (StringUtils.isNotBlank(username)) {
securityClient = SecurityClientFactory.basic(username, password, crumbData);
securityClientForTest = SecurityClientFactory.basic(username, password, crumbData, connectionTimout);
} else {
securityClient = SecurityClientFactory.none(crumbData);
securityClientForTest = SecurityClientFactory.none(crumbData, connectionTimout);
}
securityClient.connect(urlBuilder.createAuthenticationUrl(serverUrl));
securityClientForTest.connect(urlBuilder.createAuthenticationUrl(serverUrl));
}

@Override
Expand Down Expand Up @@ -395,6 +400,10 @@ private JobWithDetails getJob(@NotNull Job job) {
return jobWithDetails.orElseThrow(() -> new NoJobFoundException(job));
}

private int getConnectionTimout(int connectionTimoutInSeconds) {
return connectionTimoutInSeconds * 1000;
}

void setSecurityClient(SecurityClient securityClient) {
this.securityClient = securityClient;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public interface RequestManagerInterface {

void authenticate(JenkinsAppSettings jenkinsAppSettings, JenkinsSettings jenkinsSettings);

void authenticate(String serverUrl, String username, String password, String crumbData, JenkinsVersion version);
void testAuthenticate(String serverUrl, String username, String password, String crumbData, JenkinsVersion version, int connectionTimoutInSeconds);

List<Job> loadFavoriteJobs(List<JenkinsSettings.FavoriteJob> favoriteJobs);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@ class BasicSecurityClient extends DefaultSecurityClient {
private String password = null;


BasicSecurityClient(String username, String password, String crumbData) {
super(crumbData);
BasicSecurityClient(String username, String password, String crumbData, int connectionTimout) {
super(crumbData, connectionTimout);
this.username = username;
this.password = password;
}


@Override
public void connect(URL url) {
doAuthentication(url);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package org.codinjutsu.tools.jenkins.security;

import com.intellij.openapi.vfs.VirtualFile;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
Expand All @@ -44,18 +43,18 @@
class DefaultSecurityClient implements SecurityClient {

private static final String BAD_CRUMB_DATA = "No valid crumb was included in the request";
private static final int DEFAULT_SOCKET_TIMEOUT = 10000;
private static final int DEFAULT_CONNECTION_TIMEOUT = 10000;

protected String crumbData;
protected JenkinsVersion jenkinsVersion = JenkinsVersion.VERSION_1;
private final int connectionTimout;

protected final HttpClient httpClient;
protected Map<String, VirtualFile> files = new HashMap<>();

DefaultSecurityClient(String crumbData) {
DefaultSecurityClient(String crumbData, int connectionTimout) {
this.httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
this.crumbData = crumbData;
this.connectionTimout = connectionTimout;
}

@Override
Expand Down Expand Up @@ -83,10 +82,11 @@ public void setFiles(Map<String, VirtualFile> files) {

private PostMethod addFiles(PostMethod post) {
if (files.size() > 0) {
ArrayList<Part> parts = new ArrayList<Part>();
ArrayList<Part> parts = new ArrayList<>();
int i = 0;
for(String key: files.keySet()) {
VirtualFile virtualFile = files.get(key);
for(Map.Entry<String, VirtualFile> entry: files.entrySet()) {
VirtualFile virtualFile = entry.getValue();
final String key = entry.getKey();
parts.add(new StringPart("name", key));
parts.add(new StringPart("json", "{\"parameter\":{\"name\":\"" + key + "\",\"file\":\""+ String.format("file%d", i) +"\"}}"));
parts.add(new FilePart(String.format("file%d", i), new VirtualFilePartSource(virtualFile)));
Expand All @@ -111,8 +111,8 @@ private void runMethod(String url, ResponseCollector responseCollector) {

try {
if (files.isEmpty()) {
httpClient.getParams().setParameter("http.socket.timeout", DEFAULT_SOCKET_TIMEOUT);
httpClient.getParams().setParameter("http.connection.timeout", DEFAULT_CONNECTION_TIMEOUT);
httpClient.getParams().setParameter("http.socket.timeout", connectionTimout);
httpClient.getParams().setParameter("http.connection.timeout", connectionTimout);
} else {
httpClient.getParams().setParameter("http.socket.timeout", 0);
httpClient.getParams().setParameter("http.connection.timeout", 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,29 @@

package org.codinjutsu.tools.jenkins.security;

import org.jetbrains.annotations.NotNull;

public class SecurityClientFactory {

private static JenkinsVersion _version;

public static void setVersion(JenkinsVersion version) {
_version = version;
}

public static SecurityClient basic(String username, String password, String crumbData) {
BasicSecurityClient basicSecurityClient = new BasicSecurityClient(username, password, crumbData);
basicSecurityClient.setJenkinsVersion(_version);

return basicSecurityClient;
@NotNull
public static SecurityClient basic(String username, String password, String crumbData, int connectionTimout) {
return setConnectionProperties(new BasicSecurityClient(username, password, crumbData, connectionTimout));
}

public static SecurityClient none(String crumbData) {
DefaultSecurityClient defaultSecurityClient = new DefaultSecurityClient(crumbData);
defaultSecurityClient.setJenkinsVersion(_version);

return defaultSecurityClient;
@NotNull
public static SecurityClient none(String crumbData, int connectionTimout) {
return setConnectionProperties(new DefaultSecurityClient(crumbData, connectionTimout));
}

@NotNull
private static SecurityClient setConnectionProperties(@NotNull DefaultSecurityClient securityClient) {
securityClient.setJenkinsVersion(_version);
return securityClient;
}
}
Loading

0 comments on commit 85a7177

Please sign in to comment.