Skip to content

Commit d1c505b

Browse files
Release 2.3.4
* Fix agent debugger * Security to SessionScoped * Minimum single thread for debugger * Validate position of list before every use to avoid IndexOutOfBoundsException after a item removal * AWSXRay: setUser to currentSegment at filter * update README.MD with badges * Fix kill instances across regions * filter instances by present in region before terminate/stop. * update libraries versions * java streams * requestInstances re-write * AgentStartup retry loop * backoff Strategy for supportFiles download * NonNull TPS results return * JSF to 2.3 * CloudWatchMetrics * Remove SimpleDB DataSource * Add CloudWatch Metrics DataSource * FIBONACCI retry backoff strategy
1 parent 69e36f3 commit d1c505b

File tree

150 files changed

+813
-1495
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+813
-1495
lines changed

agent/agent_common/pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.intuit.tank</groupId>
77
<artifactId>agent-parent</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
</parent>
1010

1111
<artifactId>agent-common</artifactId>
@@ -33,7 +33,7 @@
3333
</dependency>
3434

3535
<dependency>
36-
<groupId>jdom</groupId>
36+
<groupId>org.jdom</groupId>
3737
<artifactId>jdom</artifactId>
3838
</dependency>
3939
</dependencies>

agent/agent_common/src/main/java/com/intuit/tank/http/TankHttpUtil.java

+31-63
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.ByteArrayInputStream;
44
import java.io.ByteArrayOutputStream;
5+
import java.io.UnsupportedEncodingException;
56
import java.net.MalformedURLException;
67
import java.net.URL;
78
import java.net.URLEncoder;
@@ -10,7 +11,6 @@
1011
import java.util.HashMap;
1112
import java.util.List;
1213
import java.util.Map;
13-
import java.util.Map.Entry;
1414

1515
import org.apache.commons.codec.binary.Base64;
1616
import org.apache.commons.fileupload.MultipartStream;
@@ -22,76 +22,48 @@
2222
import com.intuit.tank.http.json.JsonResponse;
2323
import com.intuit.tank.http.xml.XMLResponse;
2424

25+
import static java.util.stream.Collectors.joining;
26+
2527
/**
2628
* utitly methods for tank http clients
2729
* @author denisa
2830
*
2931
*/
3032
public class TankHttpUtil {
31-
3233
private static Logger LOG = LogManager.getLogger(TankHttpUtil.class);
3334

3435
public static URL buildUrl(String protocol, String host, int port, String path, Map<String, String> urlVariables) {
35-
3636
try {
37-
// no default port specified for http
38-
if (protocol.equalsIgnoreCase("http") && port == -1) {
39-
return new URL(protocol, host, path + getQueryString(urlVariables));
40-
} else if (protocol.equalsIgnoreCase("https") && port == -1) {
41-
return new URL(protocol, host, path + getQueryString(urlVariables));
42-
}
4337
// ensure that port 80 and 8080 requests use http and not https
4438
if (port == 80 || port == 8080) {
4539
protocol = "http";
4640
}
4741

48-
return new URL(protocol, host, port, path + getQueryString(urlVariables));
42+
// no default port specified for http
43+
return (port == -1) ?
44+
new URL(protocol, host, path + getQueryString(urlVariables)) :
45+
new URL(protocol, host, port, path + getQueryString(urlVariables));
4946
} catch (MalformedURLException e) {
5047
throw new RuntimeException(e);
5148
}
5249
}
5350

5451
public static String getQueryString(Map<String, String> urlVariables) {
55-
56-
StringBuilder queryString = new StringBuilder();
57-
58-
// Set the query string
59-
if (urlVariables != null) {
60-
if (!urlVariables.isEmpty()) {
61-
62-
queryString.append("?");
63-
64-
// Set<Map.Entry<String, String>> set = urlVariables.entrySet();
65-
// Iterator<Map.Entry<String, String>> iterator =
66-
// set.iterator();
67-
for (Entry<String, String> entry : urlVariables.entrySet()) {
68-
try {
69-
StringBuilder nvp = new StringBuilder();
70-
nvp.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.toString()));
71-
if (entry.getValue() != null) {
72-
nvp.append("=");
73-
nvp.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString()));
52+
if (urlVariables != null && !urlVariables.isEmpty()) {
53+
return "?" + urlVariables.entrySet().stream()
54+
.map(entry -> {
55+
try {
56+
return URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.name())
57+
+ "="
58+
+ URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.name());
59+
} catch (UnsupportedEncodingException ex) {
60+
LOG.warn("Unable to set query string value: " + ex.getMessage());
7461
}
75-
nvp.append("&");
76-
queryString.append(nvp.toString());
77-
78-
} catch (Exception ex) {
79-
LOG.warn("Unable to set query string value: " + ex.getMessage());
80-
}
81-
}
82-
}
83-
}
84-
85-
// Remove the last &
86-
String reqQueryString = "";
87-
if (queryString.length() > 0) {
88-
if (queryString.charAt(queryString.length() - 1) == '&')
89-
reqQueryString = queryString.deleteCharAt(queryString.length() - 1).toString();
90-
else
91-
reqQueryString = queryString.toString();
62+
return "";
63+
})
64+
.collect(joining("&"));
9265
}
93-
94-
return reqQueryString;
66+
return "";
9567
}
9668

9769
/**
@@ -101,13 +73,11 @@ public static String getQueryString(Map<String, String> urlVariables) {
10173
*/
10274
public static BaseResponse newResponseObject(String contentTypeHeader) {
10375
String contentType = StringUtils.isNotBlank(contentTypeHeader) ? contentTypeHeader : "";
104-
if (contentType.contains("xml")) {
105-
return new XMLResponse();
106-
} else if (contentType.contains("json")) {
107-
return new JsonResponse();
108-
} else {
109-
return new BinaryResponse();
110-
}
76+
return contentType.contains("xml") ?
77+
new XMLResponse() :
78+
contentType.contains("json") ?
79+
new JsonResponse() :
80+
new BinaryResponse();
11181
}
11282

11383
public static List<PartHolder> getPartsFromBody(BaseRequest request) {
@@ -196,20 +166,18 @@ public String getFileName() {
196166
// filename="diamond-sword.png"
197167
public String getContentType() {
198168
String ct = headerMap.get("Content-Type");
199-
if (ct == null) {
200-
ct = "text/plain";
201-
}
202-
return ct;
169+
return ct == null ?
170+
"text/plain" :
171+
ct;
203172
}
204173

205174
// Content-Disposition: form-data; name="uploadname1";
206175
// filename="diamond-sword.png"
207176
public String getContentDisposition() {
208177
String ct = headerMap.get("Content-Disposition");
209-
if (ct == null) {
210-
ct = "form-data";
211-
}
212-
return ct;
178+
return ct == null ?
179+
"form-data" :
180+
ct;
213181
}
214182

215183
/**

agent/agent_common/src/main/java/com/intuit/tank/http/xml/GenericXMLHandler.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@
2727
import org.apache.logging.log4j.LogManager;
2828
import org.apache.logging.log4j.Logger;
2929

30-
import org.jdom.Attribute;
31-
import org.jdom.Document;
32-
import org.jdom.Element;
33-
import org.jdom.JDOMException;
34-
import org.jdom.Namespace;
35-
import org.jdom.input.SAXBuilder;
36-
import org.jdom.output.XMLOutputter;
37-
import org.jdom.xpath.XPath;
30+
import org.jdom2.Attribute;
31+
import org.jdom2.Document;
32+
import org.jdom2.Element;
33+
import org.jdom2.JDOMException;
34+
import org.jdom2.Namespace;
35+
import org.jdom2.input.SAXBuilder;
36+
import org.jdom2.output.XMLOutputter;
37+
import org.jdom2.xpath.XPath;
3838
import org.xml.sax.InputSource;
3939

4040
/**
@@ -70,7 +70,7 @@ public GenericXMLHandler() {
7070
public GenericXMLHandler(File xmlFile) {
7171
try {
7272
this.xmlFile = xmlFile;
73-
this.xmlDocument = new org.jdom.Document();
73+
this.xmlDocument = new org.jdom2.Document();
7474
SAXBuilder builder = new SAXBuilder();
7575
builder.setValidation(false);
7676
this.xmlDocument = builder.build(this.xmlFile);
@@ -92,7 +92,7 @@ public GenericXMLHandler(String xmlFile) {
9292
this.xml = xmlFile;
9393
try {
9494
this.xmlFile = null;
95-
this.xmlDocument = new org.jdom.Document();
95+
this.xmlDocument = new org.jdom2.Document();
9696
SAXBuilder builder = new SAXBuilder();
9797
builder.setValidation(false);
9898
// LOG.debug("XML string to load: "+xmlFile);
@@ -155,7 +155,7 @@ private Element SetElementText(String xPathExpression, int currentNode) throws J
155155

156156
if (xPathExists(currentPath)) {
157157
if (currentPath.equals(xPathExpression)) {
158-
return (org.jdom.Element) XPath.selectSingleNode(this.xmlDocument, xPathExpression);
158+
return (org.jdom2.Element) XPath.selectSingleNode(this.xmlDocument, xPathExpression);
159159
}
160160
else {
161161
return SetElementText(xPathExpression, currentNode + 1);
@@ -225,7 +225,7 @@ public String GetElementText(String xPathExpression) {
225225
*/
226226
public String GetElementAttr(String xPathExpression) {
227227
try {
228-
org.jdom.Attribute node = (Attribute) XPath.selectSingleNode(this.xmlDocument, xPathExpression);
228+
org.jdom2.Attribute node = (Attribute) XPath.selectSingleNode(this.xmlDocument, xPathExpression);
229229
return node.getValue();
230230
} catch (Exception ex) {
231231
LOG.error("Error in handler: " + ex.getMessage(), ex);

agent/agent_common/src/test/java/com/intuit/tank/http/TankHttpUtilTest.java

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.intuit.tank.http;
22

3+
import static org.junit.jupiter.api.Assertions.assertEquals;
34
import static org.junit.jupiter.api.Assertions.assertNotNull;
45

56
/*
@@ -146,9 +147,13 @@ public void testGetQueryString_1()
146147
public void testGetQueryString_2()
147148
throws Exception {
148149
Map<String, String> urlVariables = new HashMap();
150+
urlVariables.put("val1", "val1");
151+
urlVariables.put("val2", "val2");
152+
urlVariables.put("val3", "val3");
149153

150154
String result = TankHttpUtil.getQueryString(urlVariables);
151155
assertNotNull(result);
156+
assertEquals( "?val3=val3&val2=val2&val1=val1", result);
152157
}
153158

154159
/**
@@ -162,9 +167,11 @@ public void testGetQueryString_2()
162167
public void testGetQueryString_3()
163168
throws Exception {
164169
Map<String, String> urlVariables = new HashMap();
170+
urlVariables.put("data", "{\"val1\":\"val1\", \"val2\":\"val2\", \"val3\":\"val3\"}");
165171

166172
String result = TankHttpUtil.getQueryString(urlVariables);
167173
assertNotNull(result);
174+
assertEquals( "?data=%7B%22val1%22%3A%22val1%22%2C+%22val2%22%3A%22val2%22%2C+%22val3%22%3A%22val3%22%7D", result);
168175
}
169176

170177
/**

agent/agent_common/src/test/java/com/intuit/tank/http/xml/GenericXMLHandlerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.io.File;
1717
import java.util.HashMap;
1818

19-
import org.jdom.Document;
19+
import org.jdom2.Document;
2020
import org.junit.jupiter.api.*;
2121

2222
import static org.junit.jupiter.api.Assertions.*;

agent/agent_standalone/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.intuit.tank</groupId>
77
<artifactId>agent-parent</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
</parent>
1010

1111
<artifactId>agent-standalone</artifactId>

agent/agent_standalone_pkg/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.intuit.tank</groupId>
77
<artifactId>agent-parent</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
</parent>
1010

1111
<artifactId>agent-standalone-pkg</artifactId>

agent/agent_startup/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.intuit.tank</groupId>
77
<artifactId>agent-parent</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
</parent>
1010

1111
<artifactId>agent-startup</artifactId>

agent/agent_startup/src/main/java/com/intuit/tank/agent/AgentStartup.java

+29-12
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@
1313
* #L%
1414
*/
1515

16+
import java.io.EOFException;
1617
import java.io.File;
1718
import java.io.FileOutputStream;
1819
import java.io.InputStream;
20+
import java.net.ConnectException;
1921
import java.net.URL;
2022
import java.nio.charset.StandardCharsets;
2123
import java.util.zip.ZipEntry;
24+
import java.util.zip.ZipException;
2225
import java.util.zip.ZipInputStream;
2326

2427
import com.amazonaws.util.StringUtils;
@@ -31,12 +34,12 @@
3134
import com.intuit.tank.vm.common.TankConstants;
3235

3336
public class AgentStartup implements Runnable {
34-
3537
private static Logger logger = LogManager.getLogger(AgentStartup.class);
3638
private static final String SERVICE_RELATIVE_PATH = "/rest/v1/agent-service";
3739
private static final String METHOD_SETTINGS = "/settings";
3840
private static final String API_HARNESS_COMMAND = "./startAgent.sh";
3941
private static final String METHOD_SUPPORT = "/supportFiles";
42+
private static final int[] FIBONACCI = new int[] { 1, 1, 2, 3, 5, 8, 13 };
4043

4144
private final String controllerBaseUrl;
4245

@@ -55,25 +58,39 @@ public void run() {
5558
String settings = IOUtils.toString(settingsStream, StandardCharsets.UTF_8);
5659
FileUtils.writeStringToFile(new File("settings.xml"), settings, StandardCharsets.UTF_8);
5760
logger.info("got settings file...");
61+
} catch (ConnectException ce) {
62+
logger.error("Error creating connection to "
63+
+ controllerBaseUrl + " : this is normal during the bake : " + ce.getMessage());
5864
}
65+
// Download Support Files
5966
url = new URL(controllerBaseUrl + SERVICE_RELATIVE_PATH + METHOD_SUPPORT);
6067
logger.info("Making call to tank service url to get support files " + url.toExternalForm());
61-
try ( ZipInputStream zip = new ZipInputStream(url.openStream()) ){
62-
ZipEntry entry = zip.getNextEntry();
63-
while (entry != null) {
64-
String name = entry.getName();
65-
logger.info("Got file from controller: " + name);
66-
File f = new File(name);
67-
try ( FileOutputStream fout = FileUtils.openOutputStream(f) ) {
68-
IOUtils.copy(zip, fout);
68+
int retryCount = 0;
69+
while (true) {
70+
try (ZipInputStream zip = new ZipInputStream(url.openStream())) {
71+
ZipEntry entry = zip.getNextEntry();
72+
while (entry != null) {
73+
String name = entry.getName();
74+
logger.info("Got file from controller: " + name);
75+
File f = new File(name);
76+
try (FileOutputStream fout = FileUtils.openOutputStream(f)) {
77+
IOUtils.copy(zip, fout);
78+
}
79+
entry = zip.getNextEntry();
6980
}
70-
entry = zip.getNextEntry();
81+
break;
82+
} catch (EOFException | ZipException e) {
83+
logger.error("Error unzipping support files : retryCount="
84+
+ retryCount + " : " + e.getMessage());
85+
if (retryCount < FIBONACCI.length) {
86+
Thread.sleep( FIBONACCI[++retryCount] * 1000 );
87+
} else throw e;
7188
}
7289
}
7390
// now start the harness
7491
String jvmArgs = AmazonUtil.getUserDataAsMap().get(TankConstants.KEY_JVM_ARGS);
75-
logger.info("Starting apiharness with command: " + API_HARNESS_COMMAND + " -http=" + controllerBaseUrl + " "
76-
+ jvmArgs);
92+
logger.info("Starting apiharness with command: "
93+
+ API_HARNESS_COMMAND + " -http=" + controllerBaseUrl + " " + jvmArgs);
7794
Runtime.getRuntime().exec(API_HARNESS_COMMAND + " -http=" + controllerBaseUrl + " " + jvmArgs);
7895
} catch (Exception e) {
7996
logger.error("Error in AgentStartup " + e, e);

agent/agent_startup_pkg/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>com.intuit.tank</groupId>
77
<artifactId>agent-parent</artifactId>
8-
<version>2.3.3</version>
8+
<version>2.3.4</version>
99
</parent>
1010

1111
<artifactId>agent-startup-pkg</artifactId>

0 commit comments

Comments
 (0)