diff options
author | Young Gyu Park <younggyu@google.com> | 2018-05-03 18:29:49 +0900 |
---|---|---|
committer | Young Gyu Park <younggyu@google.com> | 2018-05-09 10:59:51 +0900 |
commit | d3edb7b7e958bba8aded6057ee6a647906469d35 (patch) | |
tree | bdcfd5ac6797c704c42408a524d94c0a4fb1f0e5 | |
parent | a00c785f144e5c3a19b1fe91f8e3ff6d4b24eefd (diff) | |
download | dashboard-d3edb7b7e958bba8aded6057ee6a647906469d35.tar.gz |
Bugnizer link button
Test: go/vts-web-staging/show_plan_release?plan=vts&type=suite&page=1
Bug: 79183660
Change-Id: I1af599e9a10fa8da6b9966d5cf64899134fddc6e
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | pom.xml | 91 | ||||
-rw-r--r-- | src/main/java/com/android/vts/entity/TestSuiteResultEntity.java | 155 | ||||
-rw-r--r-- | src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java | 2 | ||||
-rw-r--r-- | src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java | 3 | ||||
-rw-r--r-- | src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java | 2 | ||||
-rw-r--r-- | src/main/resources/bug_tracking_system/buganizer/config.properties | 12 | ||||
-rw-r--r-- | src/main/resources/config.properties | 2 | ||||
-rw-r--r-- | src/main/webapp/WEB-INF/jsp/show_suite_release.jsp | 7 |
9 files changed, 230 insertions, 47 deletions
@@ -2,7 +2,8 @@ appengine-generated/ # Secutiry Key file folder -src/main/webapp/WEB-INF/keys +src/main/resources/keys/ +src/main/resources/bug_tracking_system/**/*.tpl # Java *.class @@ -169,45 +169,56 @@ <build> <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</outputDirectory> - <plugins> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <version>2.6</version> - <configuration> - <archiveClasses>true</archiveClasses> - <failOnMissingWebXml>false</failOnMissingWebXml> - <webResources> - <resource> - <directory>${basedir}/src/main/webapp/WEB-INF</directory> - <filtering>true</filtering> - <targetPath>WEB-INF</targetPath> - </resource> - </webResources> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <version>3.3</version> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>1.8</source> - <target>1.8</target> - </configuration> - </plugin> - - <plugin> - <groupId>com.google.appengine</groupId> - <artifactId>appengine-maven-plugin</artifactId> - <version>${appengine.version}</version> - <configuration> - <appId>${app.id}</appId> - <version>${app.version}</version> - </configuration> - </plugin> - - </plugins> + <resources> + <resource> + <directory>src/main/resources</directory> + <includes> + <include>**/*.properties</include> + <include>**/*.json</include> + <include>**/*.tpl</include> + </includes> + </resource> + </resources> + + <plugins> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-war-plugin</artifactId> + <version>2.6</version> + <configuration> + <archiveClasses>true</archiveClasses> + <failOnMissingWebXml>false</failOnMissingWebXml> + <webResources> + <resource> + <directory>${basedir}/src/main/webapp/WEB-INF</directory> + <filtering>true</filtering> + <targetPath>WEB-INF</targetPath> + </resource> + </webResources> + </configuration> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <version>3.3</version> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + + <plugin> + <groupId>com.google.appengine</groupId> + <artifactId>appengine-maven-plugin</artifactId> + <version>${appengine.version}</version> + <configuration> + <appId>${app.id}</appId> + <version>${app.version}</version> + </configuration> + </plugin> + + </plugins> </build> </project> diff --git a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java index 9c5422a..3ebece7 100644 --- a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java +++ b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java @@ -26,13 +26,31 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; - +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.text.StrSubstitutor; +import org.apache.http.NameValuePair; +import org.apache.http.ParseException; +import org.apache.http.client.utils.URIUtils; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.message.BasicNameValuePair; + +import javax.servlet.ServletContext; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -46,6 +64,37 @@ import static com.googlecode.objectify.ObjectifyService.ofy; @NoArgsConstructor public class TestSuiteResultEntity { + /** Bug Tracking System Property class */ + private static Properties bugTrackingSystemProp = new Properties(); + + /** System Configuration Property class */ + private static Properties systemConfigProp = new Properties(); + + static { + try { + InputStream defaultInputStream = + TestSuiteResultEntity.class + .getClassLoader() + .getResourceAsStream("config.properties"); + systemConfigProp.load(defaultInputStream); + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + InputStream btsInputStream = + TestSuiteResultEntity.class + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + + bugTrackingSystem + + "/config.properties"); + bugTrackingSystemProp.load(btsInputStream); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public enum TestType { UNKNOWN(0), TOT(1), @@ -253,4 +302,108 @@ public class TestSuiteResultEntity { return testType; } } + + private String getLabInfraIssueDescription() throws IOException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + String templateName = + bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.template.name"); + + InputStream inputStream = + this.getClass() + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + bugTrackingSystem + "/" + templateName); + + String templateDescription = IOUtils.toString(inputStream, "UTF-8"); + + Map<String, String> valuesMap = new HashMap<>(); + valuesMap.put("suiteBuildNumber", suiteBuildNumber); + valuesMap.put("buildId", buildId); + valuesMap.put("modulesDone", Integer.toString(modulesDone)); + valuesMap.put("modulesTotal", Integer.toString(modulesTotal)); + valuesMap.put("hostName", hostName); + valuesMap.put("resultPath", resultPath); + valuesMap.put("buildVendorFingerprint", buildVendorFingerprint); + valuesMap.put("buildSystemFingerprint", buildSystemFingerprint); + + StrSubstitutor sub = new StrSubstitutor(valuesMap); + String resolvedDescription = sub.replace(templateDescription); + + return resolvedDescription; + } + + private String getCrashSecurityDescription() throws IOException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + String templateName = + bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.template.name"); + + InputStream inputStream = + this.getClass() + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + bugTrackingSystem + "/" + templateName); + + String templateDescription = IOUtils.toString(inputStream, "UTF-8"); + + Map<String, String> valuesMap = new HashMap<>(); + valuesMap.put("suiteBuildNumber", suiteBuildNumber); + valuesMap.put("buildId", buildId); + valuesMap.put("hostName", hostName); + valuesMap.put("resultPath", resultPath); + valuesMap.put("buildVendorFingerprint", buildVendorFingerprint); + valuesMap.put("buildSystemFingerprint", buildSystemFingerprint); + + StrSubstitutor sub = new StrSubstitutor(valuesMap); + String resolvedDescription = sub.replace(templateDescription); + + return resolvedDescription; + } + + public String getBuganizerLink() throws IOException, ParseException, URISyntaxException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + List<NameValuePair> qparams = new ArrayList<NameValuePair>(); + if (!this.bootSuccess || (this.passedTestCaseCount == 0 && this.failedTestCaseCount == 0)) { + qparams.add( + new BasicNameValuePair( + "component", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.component.id"))); + qparams.add( + new BasicNameValuePair( + "template", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.template.id"))); + qparams.add(new BasicNameValuePair("description", this.getLabInfraIssueDescription())); + } else { + qparams.add( + new BasicNameValuePair( + "component", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.component.id"))); + qparams.add( + new BasicNameValuePair( + "template", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.template.id"))); + qparams.add(new BasicNameValuePair("description", this.getCrashSecurityDescription())); + } + + URI uri = + URIUtils.createURI( + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.scheme"), + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.host"), + -1, + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.path"), + URLEncodedUtils.format(qparams, "UTF-8"), + null); + return uri.toString(); + } } diff --git a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java b/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java index e4989fb..1884513 100644 --- a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java +++ b/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java @@ -122,7 +122,7 @@ public class VtsSuiteTestJobServlet extends HttpServlet { super.init(servletConfig); this.keyFileInputStream = - this.getServletContext().getResourceAsStream("/WEB-INF/keys/" + GCS_KEY_FILE); + this.getClass().getClassLoader().getResourceAsStream("keys/" + GCS_KEY_FILE); Optional<Storage> optionalStorage = GcsHelper.getStorage(this.keyFileInputStream); if (optionalStorage.isPresent()) { diff --git a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java b/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java index 340edfe..f9b6f85 100644 --- a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java +++ b/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java @@ -78,8 +78,7 @@ public class ShowGcsLogServlet extends BaseServlet { public void init(ServletConfig cfg) throws ServletException { super.init(cfg); - this.keyFileInputStream = - this.getServletContext().getResourceAsStream("/WEB-INF/keys/" + GCS_KEY_FILE); + this.keyFileInputStream = this.getClass().getClassLoader().getResourceAsStream("keys/" + GCS_KEY_FILE); Optional<Storage> optionalStorage = GcsHelper.getStorage(this.keyFileInputStream); if (optionalStorage.isPresent()) { diff --git a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java index 4b2ac88..cd1dd41 100644 --- a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java +++ b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java @@ -302,7 +302,7 @@ public class ShowPlanReleaseServlet extends BaseServlet { ofy().load() .type(TestSuiteResultEntity.class) .filter("suitePlan", testPlan) - .filter("testType", testCategoryType) + .filter("testType", Integer.parseInt(testCategoryType)) .orderKey(true); Pagination<TestSuiteResultEntity> testSuiteResultEntityPagination = diff --git a/src/main/resources/bug_tracking_system/buganizer/config.properties b/src/main/resources/bug_tracking_system/buganizer/config.properties new file mode 100644 index 0000000..d83ad57 --- /dev/null +++ b/src/main/resources/bug_tracking_system/buganizer/config.properties @@ -0,0 +1,12 @@ + +buganizer.uri.scheme= +buganizer.uri.host= +buganizer.uri.path= + +buganizer.labInfraIssue.template.name= +buganizer.labInfraIssue.component.id= +buganizer.labInfraIssue.template.id= + +buganizer.crashSecurity.template.name= +buganizer.crashSecurity.component.id= +buganizer.crashSecurity.template.id= diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..7e9010c --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1,2 @@ + +bug.tracking.system= diff --git a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp index 1ad19cc..3670561 100644 --- a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp +++ b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp @@ -149,12 +149,17 @@ <b>Device Name: </b><c:out value="${testSuiteResultEntity.deviceName}"></c:out><br> </span> </div> - <div class="col s7"> + <div class="col s5"> <span class="suite-test-run-metadata"> <b>Host: </b><c:out value="${testSuiteResultEntity.hostName}"></c:out><br> <b>Modules: </b><c:out value="${testSuiteResultEntity.modulesDone}"></c:out>/<c:out value="${testSuiteResultEntity.modulesTotal}"></c:out><br> </span> </div> + <div class="col s2" style="padding: 5px 12px;"> + <a href="<c:out value="${testSuiteResultEntity.buganizerLink}"></c:out>" class="waves-effect waves-light btn right blue-grey" style="padding: 0 15px;" target="_blank"> + Buganizer + </a> + </div> <div class="col s12"> <span class="suite-test-run-metadata"> <b>Result Log Path: </b> |