azkaban-aplcache
Changes
azkaban-web-server/src/main/less/flow.less 50(+25 -25)
azkaban-web-server/src/main/tl/flowstats.tl 298(+149 -149)
azkaban-web-server/src/main/tl/flowsummary.tl 161(+83 -78)
Details
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java b/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
index 45d9925..963788e 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/AzkabanWebServer.java
@@ -98,22 +98,19 @@ import org.mortbay.thread.QueuedThreadPool;
/**
* The Azkaban Jetty server class
*
- * Global azkaban properties for setup. All of them are optional unless
- * otherwise marked: azkaban.name - The displayed name of this instance.
- * azkaban.label - Short descriptor of this Azkaban instance. azkaban.color -
- * Theme color azkaban.temp.dir - Temp dir used by Azkaban for various file
- * uses. web.resource.dir - The directory that contains the static web files.
+ * Global azkaban properties for setup. All of them are optional unless otherwise marked:
+ * azkaban.name - The displayed name of this instance. azkaban.label - Short descriptor of this
+ * Azkaban instance. azkaban.color - Theme color azkaban.temp.dir - Temp dir used by Azkaban for
+ * various file uses. web.resource.dir - The directory that contains the static web files.
* default.timezone.id - The timezone code. I.E. America/Los Angeles
*
- * user.manager.class - The UserManager class used for the user manager. Default
- * is XmlUserManager. project.manager.class - The ProjectManager to load
- * projects project.global.properties - The base properties inherited by all
- * projects and jobs
+ * user.manager.class - The UserManager class used for the user manager. Default is XmlUserManager.
+ * project.manager.class - The ProjectManager to load projects project.global.properties - The base
+ * properties inherited by all projects and jobs
*
- * jetty.maxThreads - # of threads for jetty jetty.ssl.port - The ssl port used
- * for sessionizing. jetty.keystore - Jetty keystore . jetty.keypassword - Jetty
- * keystore password jetty.truststore - Jetty truststore jetty.trustpassword -
- * Jetty truststore password
+ * jetty.maxThreads - # of threads for jetty jetty.ssl.port - The ssl port used for sessionizing.
+ * jetty.keystore - Jetty keystore . jetty.keypassword - Jetty keystore password jetty.truststore -
+ * Jetty truststore jetty.trustpassword - Jetty truststore password
*/
public class AzkabanWebServer extends AzkabanServer {
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
index 673abee..a9da66c 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/AbstractAzkabanServlet.java
@@ -123,8 +123,7 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Retrieves the param from the http servlet request. Will throw an exception
- * if not found
+ * Retrieves the param from the http servlet request. Will throw an exception if not found
*/
public String getParam(final HttpServletRequest request, final String name)
throws ServletException {
@@ -140,8 +139,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Returns the param and parses it into an int. Will throw an exception if not
- * found, or a parse error if the type is incorrect.
+ * Returns the param and parses it into an int. Will throw an exception if not found, or a parse
+ * error if the type is incorrect.
*/
public int getIntParam(final HttpServletRequest request, final String name)
throws ServletException {
@@ -190,8 +189,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Sets an error message in azkaban.failure.message in the cookie. This will
- * be used by the web client javascript to somehow display the message
+ * Sets an error message in azkaban.failure.message in the cookie. This will be used by the web
+ * client javascript to somehow display the message
*/
protected void setErrorMessageInCookie(final HttpServletResponse response,
final String errorMsg) {
@@ -201,8 +200,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Sets a warning message in azkaban.warn.message in the cookie. This will
- * be used by the web client javascript to somehow display the message
+ * Sets a warning message in azkaban.warn.message in the cookie. This will be used by the web
+ * client javascript to somehow display the message
*/
protected void setWarnMessageInCookie(final HttpServletResponse response,
final String errorMsg) {
@@ -212,8 +211,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Sets a message in azkaban.success.message in the cookie. This will be used
- * by the web client javascript to somehow display the message
+ * Sets a message in azkaban.success.message in the cookie. This will be used by the web client
+ * javascript to somehow display the message
*/
protected void setSuccessMessageInCookie(final HttpServletResponse response,
final String message) {
@@ -259,8 +258,8 @@ public abstract class AbstractAzkabanServlet extends HttpServlet {
}
/**
- * Retrieves a cookie by name. Potential issue in performance if a lot of
- * cookie variables are used.
+ * Retrieves a cookie by name. Potential issue in performance if a lot of cookie variables are
+ * used.
*/
protected Cookie getCookieByName(final HttpServletRequest request, final String name) {
final Cookie[] cookies = request.getCookies();
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/JMXHttpServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/JMXHttpServlet.java
index a172ab0..1ca04a2 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/JMXHttpServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/JMXHttpServlet.java
@@ -20,9 +20,6 @@ import azkaban.executor.ConnectorParams;
import azkaban.executor.ExecutorManagerAdapter;
import azkaban.server.session.Session;
import azkaban.trigger.TriggerManager;
-import azkaban.user.Permission;
-import azkaban.user.Role;
-import azkaban.user.User;
import azkaban.user.UserManager;
import azkaban.webapp.AzkabanWebServer;
import java.io.IOException;
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
index 4fc1fe2..6b4b729 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/LoginAbstractAzkabanServlet.java
@@ -47,8 +47,7 @@ import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
/**
- * Abstract Servlet that handles auto login when the session hasn't been
- * verified.
+ * Abstract Servlet that handles auto login when the session hasn't been verified.
*/
public abstract class LoginAbstractAzkabanServlet extends
AbstractAzkabanServlet {
@@ -346,16 +345,15 @@ public abstract class LoginAbstractAzkabanServlet extends
* Disallows users from logging in by passing their username and password via the request header
* where it'd be logged.
*
- * Example of illegal post request:
- * curl -X POST http://localhost:8081/?action=login\&username=azkaban\&password=azkaban
+ * Example of illegal post request: curl -X POST http://localhost:8081/?action=login\&username=azkaban\&password=azkaban
*
* req.getParameterMap() or req.getParameterNames() cannot be used because they draw no
- * distinction between the illegal request above and the following valid request:
- * curl -X POST -d "action=login&username=azkaban&password=azkaban" http://localhost:8081/
+ * distinction between the illegal request above and the following valid request: curl -X POST -d
+ * "action=login&username=azkaban&password=azkaban" http://localhost:8081/
*
* "password=" is searched for because it leverages the query syntax to determine that the user is
- * passing the password as a parameter name. There is no other ajax call that has a parameter
- * that includes the string "password" at the end which could throw false positives.
+ * passing the password as a parameter name. There is no other ajax call that has a parameter that
+ * includes the string "password" at the end which could throw false positives.
*/
private boolean isIllegalPostRequest(final HttpServletRequest req) {
return (req.getQueryString() != null && req.getQueryString().contains("password="));
@@ -440,24 +438,21 @@ public abstract class LoginAbstractAzkabanServlet extends
}
/**
- * The get request is handed off to the implementor after the user is logged
- * in.
+ * The get request is handed off to the implementor after the user is logged in.
*/
protected abstract void handleGet(HttpServletRequest req,
HttpServletResponse resp, Session session) throws ServletException,
IOException;
/**
- * The post request is handed off to the implementor after the user is logged
- * in.
+ * The post request is handed off to the implementor after the user is logged in.
*/
protected abstract void handlePost(HttpServletRequest req,
HttpServletResponse resp, Session session) throws ServletException,
IOException;
/**
- * The post request is handed off to the implementor after the user is logged
- * in.
+ * The post request is handed off to the implementor after the user is logged in.
*/
protected void handleMultiformPost(final HttpServletRequest req,
final HttpServletResponse resp, final Map<String, Object> multipart, final Session session)
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/NoteServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/NoteServlet.java
index 10fdf13..460eb37 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/NoteServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/NoteServlet.java
@@ -33,11 +33,11 @@ import org.apache.log4j.Logger;
public class NoteServlet extends LoginAbstractAzkabanServlet {
private static final long serialVersionUID = 1L;
- private static final Logger logger = Logger .getLogger(NoteServlet.class);
+ private static final Logger logger = Logger.getLogger(NoteServlet.class);
public static String type = null;
public static String message = null;
- public static String url= null;
+ public static String url = null;
private AzkabanWebServer server;
@Override
@@ -49,25 +49,26 @@ public class NoteServlet extends LoginAbstractAzkabanServlet {
@Override
protected void handleGet(final HttpServletRequest req, final HttpServletResponse resp,
final Session session) throws ServletException, IOException {
- if(isAdmin(session.getUser())) {
+ if (isAdmin(session.getUser())) {
handleNotePageLoad(req, resp, session);
- } else {
+ } else {
warningNonAdminUsers(resp, "The requested user doesn't have admin permission");
}
}
- private void warningNonAdminUsers(final HttpServletResponse resp, final String message) throws IOException {
+ private void warningNonAdminUsers(final HttpServletResponse resp, final String message)
+ throws IOException {
final HashMap<String, Object> ret = new HashMap<>();
ret.put("error", message);
this.writeJSON(resp, ret);
}
private void handleNotePageLoad(final HttpServletRequest req,
- final HttpServletResponse resp, final Session session) throws ServletException,
+ final HttpServletResponse resp, final Session session) throws ServletException,
IOException {
final Page page = newPage(req, resp, session,
- "azkaban/webapp/servlet/velocity/notepage.vm");
+ "azkaban/webapp/servlet/velocity/notepage.vm");
page.add("note_type", type);
page.add("note_message", message);
@@ -77,7 +78,7 @@ public class NoteServlet extends LoginAbstractAzkabanServlet {
@Override
protected void handlePost(final HttpServletRequest req, final HttpServletResponse resp,
- final Session session) throws ServletException, IOException {
+ final Session session) throws ServletException, IOException {
if (isAdmin(session.getUser()) && hasParam(req, "ajax")) {
handleAJAXAction(req, resp, session);
} else {
@@ -94,7 +95,7 @@ public class NoteServlet extends LoginAbstractAzkabanServlet {
try {
if (ajaxName.equals("addNote")) {
ajaxAddNotes(req, ret);
- } else if (ajaxName.equals("removeNote")){
+ } else if (ajaxName.equals("removeNote")) {
ajaxRemoveNotes(ret);
} else {
ret.put("error", "Can not find the ajax operation");
@@ -106,9 +107,9 @@ public class NoteServlet extends LoginAbstractAzkabanServlet {
}
private void ajaxAddNotes(final HttpServletRequest req,
- final Map<String, Object> ret) throws ServletException {
+ final Map<String, Object> ret) throws ServletException {
type = getParam(req, "type");
- message= getParam(req, "message");
+ message = getParam(req, "message");
url = getParam(req, "url");
logger.info("receive note message. Type: " + type + " message: " + message + " url: " + url);
ret.put("status", "success");
@@ -116,7 +117,7 @@ public class NoteServlet extends LoginAbstractAzkabanServlet {
private void ajaxRemoveNotes(final Map<String, Object> ret) throws ServletException {
type = null;
- message= null;
+ message = null;
url = null;
logger.info("removing note from memory.");
ret.put("status", "success");
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/PageUtils.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/PageUtils.java
index f3a7f51..4d2e14d 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/PageUtils.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/PageUtils.java
@@ -18,7 +18,8 @@ public final class PageUtils {
* "lockdown.upload.projects" is set. The button is displayed for admin users and users with
* upload permissions.
*/
- public static void hideUploadButtonWhenNeeded(final Page page, final Session session, final UserManager userManager,
+ public static void hideUploadButtonWhenNeeded(final Page page, final Session session,
+ final UserManager userManager,
final Boolean lockdownUploadProjects) {
final User user = session.getUser();
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 4e05945..acaed57 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -526,8 +526,8 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
}
/**
- * validate readiness of a project and user permission and use projectManager
- * to purge the project if things looks good
+ * validate readiness of a project and user permission and use projectManager to purge the project
+ * if things looks good
**/
private void handlePurgeProject(final HttpServletRequest req,
final HttpServletResponse resp, final Session session) throws ServletException,
@@ -1030,8 +1030,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
}
/**
- * this only returns user permissions, but not group permissions and proxy
- * users
+ * this only returns user permissions, but not group permissions and proxy users
*/
private void ajaxGetPermissions(final Project project, final HashMap<String, Object> ret) {
final ArrayList<HashMap<String, Object>> permissions =
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
index 76cb901..1e4f680 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectServlet.java
@@ -105,12 +105,10 @@ public class ProjectServlet extends LoginAbstractAzkabanServlet {
}
/**
- * We know the intention of API call is to return project ownership based on
- * given user. <br>
- * If user provides an user name, the method honors it <br>
- * If user provides an empty user name, the user defaults to the session user<br>
- * If user does not provide the user param, the user also defaults to the
- * session user<br>
+ * We know the intention of API call is to return project ownership based on given user. <br> If
+ * user provides an user name, the method honors it <br> If user provides an empty user name, the
+ * user defaults to the session user<br> If user does not provide the user param, the user also
+ * defaults to the session user<br>
*/
private void handleFetchUserProjects(final HttpServletRequest req, final Session session,
final ProjectManager manager, final HashMap<String, Object> ret)
@@ -222,10 +220,10 @@ public class ProjectServlet extends LoginAbstractAzkabanServlet {
}
/**
- * This class is used to represent a simplified project, which can be returned
- * to end users via REST API. This is done in consideration that the API
- * caller only wants certain project level information regarding a project,
- * but does not want every flow and every job inside that project.
+ * This class is used to represent a simplified project, which can be returned to end users via
+ * REST API. This is done in consideration that the API caller only wants certain project level
+ * information regarding a project, but does not want every flow and every job inside that
+ * project.
*
* @author jyu
*/
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/StatsServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/StatsServlet.java
index f3f0aa7..e6eac84 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/StatsServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/StatsServlet.java
@@ -21,8 +21,6 @@ import azkaban.executor.Executor;
import azkaban.executor.ExecutorManager;
import azkaban.executor.ExecutorManagerException;
import azkaban.server.session.Session;
-import azkaban.user.Permission;
-import azkaban.user.Role;
import azkaban.user.User;
import azkaban.user.UserManager;
import azkaban.utils.Pair;
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/WebMetrics.java b/azkaban-web-server/src/main/java/azkaban/webapp/WebMetrics.java
index b22e428..01af3e9 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/WebMetrics.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/WebMetrics.java
@@ -24,8 +24,8 @@ import java.util.concurrent.atomic.AtomicLong;
/**
- * This singleton class WebMetrics is in charge of collecting varieties of metrics
- * from azkaban-web-server modules.
+ * This singleton class WebMetrics is in charge of collecting varieties of metrics from
+ * azkaban-web-server modules.
*/
@Singleton
public class WebMetrics {
@@ -47,10 +47,9 @@ public class WebMetrics {
/**
* Mark the occurrence of a GET call
*
- * This method should be Thread Safe.
- * Two reasons that we don't make this function call synchronized:
- * 1). drop wizard metrics deals with concurrency internally;
- * 2). mark is basically a math addition operation, which should not cause race condition issue.
+ * This method should be Thread Safe. Two reasons that we don't make this function call
+ * synchronized: 1). drop wizard metrics deals with concurrency internally; 2). mark is basically
+ * a math addition operation, which should not cause race condition issue.
*/
public void markWebGetCall() {
this.webGetCall.mark();
diff --git a/azkaban-web-server/src/main/less/azkaban.less b/azkaban-web-server/src/main/less/azkaban.less
index 0f13144..c33365e 100644
--- a/azkaban-web-server/src/main/less/azkaban.less
+++ b/azkaban-web-server/src/main/less/azkaban.less
@@ -1,16 +1,12 @@
@import "variables.less";
@import "non-responsive.less";
-
@import "base.less";
@import "off-canvas.less";
-
@import "navbar.less";
@import "header.less";
-
@import "context-menu.less";
@import "tables.less";
@import "callout.less";
-
@import "login.less";
@import "project.less";
@import "flow.less";
diff --git a/azkaban-web-server/src/main/less/context-menu.less b/azkaban-web-server/src/main/less/context-menu.less
index 47e3875..671ac6e 100644
--- a/azkaban-web-server/src/main/less/context-menu.less
+++ b/azkaban-web-server/src/main/less/context-menu.less
@@ -26,7 +26,7 @@
background-position: -32px -16px;
height: 16px;
width: 16px;
- float:right;
+ float: right;
}
&:hover {
azkaban-web-server/src/main/less/flow.less 50(+25 -25)
diff --git a/azkaban-web-server/src/main/less/flow.less b/azkaban-web-server/src/main/less/flow.less
index 01e7386..d85d4eb 100644
--- a/azkaban-web-server/src/main/less/flow.less
+++ b/azkaban-web-server/src/main/less/flow.less
@@ -1,25 +1,25 @@
#svgDiv {
- height: 100%;
- padding: 0px;
+ height: 100%;
+ padding: 0px;
}
#graphView {
- -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- user-select: none;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
}
#flow-graph {
- width: 100%;
- height: 100%;
+ width: 100%;
+ height: 100%;
}
#headertabs {
- -moz-user-select: none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- user-select: none;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
}
#flow-executing-graph {
@@ -34,7 +34,7 @@
height: 24px;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
}
.flow-progress-bar {
@@ -42,9 +42,9 @@
background-color: #ccc;
border-radius: 5px;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-webkit-transition: width 0.6s ease;
- transition: width 0.6s ease;
+ transition: width 0.6s ease;
&.attempt {
opacity: 0.70;
@@ -73,7 +73,7 @@
background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
background-size: 40px 40px;
-webkit-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
}
&.QUEUED {
@@ -89,7 +89,7 @@ td {
> .listExpand {
width: 16px;
height: 16px;
- float:right;
+ float: right;
margin-top: 5px;
font-size: 8pt;
}
@@ -258,7 +258,7 @@ li.tree-list-item {
}
&.subFilter > a > .expandarrow {
- color : #f19153;
+ color: #f19153;
}
> a {
@@ -346,11 +346,11 @@ li.tree-list-item {
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
-
- &:hover, &:focus {
- color: #ffffff;
- text-decoration: none;
- border-color: #39b3d7;
- background-color: #269abc;
- }
+
+ &:hover, &:focus {
+ color: #ffffff;
+ text-decoration: none;
+ border-color: #39b3d7;
+ background-color: #269abc;
+ }
}
diff --git a/azkaban-web-server/src/main/less/login.less b/azkaban-web-server/src/main/less/login.less
index 80dc4af..4533a79 100644
--- a/azkaban-web-server/src/main/less/login.less
+++ b/azkaban-web-server/src/main/less/login.less
@@ -10,8 +10,8 @@
height: auto;
padding: 10px;
-webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
&:focus {
z-index: 2;
diff --git a/azkaban-web-server/src/main/less/navbar.less b/azkaban-web-server/src/main/less/navbar.less
index 4878951..9cf9df4 100644
--- a/azkaban-web-server/src/main/less/navbar.less
+++ b/azkaban-web-server/src/main/less/navbar.less
@@ -32,7 +32,7 @@
font-family: Helvetica, Arial, Sans-Serif;
font-size: 118.75%;
font-weight: bold;
- line-height: 100%;
+ line-height: 100%;
}
.navbar-enviro-server {
diff --git a/azkaban-web-server/src/main/less/non-responsive.less b/azkaban-web-server/src/main/less/non-responsive.less
index 7fa282c..72b6a4f 100644
--- a/azkaban-web-server/src/main/less/non-responsive.less
+++ b/azkaban-web-server/src/main/less/non-responsive.less
@@ -32,6 +32,7 @@
.navbar-toggle {
display: none;
}
+
.navbar-collapse {
border-top: 0;
}
@@ -45,9 +46,11 @@
float: left;
margin: 0;
}
+
.navbar-nav > li {
float: left;
}
+
.navbar-nav > li > a {
padding: 15px;
}
@@ -67,11 +70,13 @@
border-width: 0 1px 1px;
border-radius: 0 0 4px 4px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
- box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
}
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
color: #333;
}
+
.navbar .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar .navbar-nav .open .dropdown-menu > li > a:focus,
.navbar .navbar-nav .open .dropdown-menu > .active > a,
@@ -80,6 +85,7 @@
color: #fff !important;
background-color: #428bca !important;
}
+
.navbar .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .disabled > a:focus {
diff --git a/azkaban-web-server/src/main/less/tables.less b/azkaban-web-server/src/main/less/tables.less
index 9b0d83d..1f0b465 100644
--- a/azkaban-web-server/src/main/less/tables.less
+++ b/azkaban-web-server/src/main/less/tables.less
@@ -127,7 +127,7 @@ table.table-properties {
width: 30px;
}
- &.timeline {
+ &.timeline {
width: 280px;
padding: 0px 0px 0px 4px;
height: 100%;
diff --git a/azkaban-web-server/src/main/less/variables.less b/azkaban-web-server/src/main/less/variables.less
index 078d2b2..ef0e827 100644
--- a/azkaban-web-server/src/main/less/variables.less
+++ b/azkaban-web-server/src/main/less/variables.less
@@ -1,4 +1,3 @@
-
// Flow colors
@flow-succeeded-color: #5cb85c;
@flow-failed-color: #d9534f;
azkaban-web-server/src/main/tl/flowstats.tl 298(+149 -149)
diff --git a/azkaban-web-server/src/main/tl/flowstats.tl b/azkaban-web-server/src/main/tl/flowstats.tl
index 5276ce8..e9b84de 100644
--- a/azkaban-web-server/src/main/tl/flowstats.tl
+++ b/azkaban-web-server/src/main/tl/flowstats.tl
@@ -1,155 +1,155 @@
- {?histogram}
- <div class="row">
- <div class="col-xs-12">
- <div class="well well-clear well-sm">
- <div id="job-histogram"></div>
- </div>
- </div>
+{?histogram}
+ <div class="row">
+ <div class="col-xs-12">
+ <div class="well well-clear well-sm">
+ <div id="job-histogram"></div>
</div>
- {/histogram}
+ </div>
+ </div>
+{/histogram}
- {?warnings}
- <div class="alert alert-warning">
- <h4>Warnings</h4>
- <p>These stats may have reduced accuracy due to the following missing information:</p>
- <ul>
- {#warnings}
- <li>{.}</li>
- {/warnings}
- </ul>
- </div>
+{?warnings}
+ <div class="alert alert-warning">
+ <h4>Warnings</h4>
+ <p>These stats may have reduced accuracy due to the following missing information:</p>
+ <ul>
+ {#warnings}
+ <li>{.}</li>
{/warnings}
+ </ul>
+ </div>
+{/warnings}
- <div class="row">
- <div class="col-xs-12">
- <h4>Resources</h4>
- <table class="table table-bordered table-condensed table-striped">
- <thead>
- <tr>
- <th class="property-key">Resource</th>
- <th class="property-key">Value</th>
- <th>Job Name</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="property-key">Max Map Slots</td>
- <td>{stats.mapSlots.max}</td>
- <td>{stats.mapSlots.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max Reduce Slots</td>
- <td>{stats.reduceSlots.max}</td>
- <td>{stats.reduceSlots.job}</td>
- </tr>
- <tr>
- <td class="property-key">Total Map Slots</td>
- <td colspan="2">{stats.totalMapSlots}</td>
- </tr>
- <tr>
- <td class="property-key">Total Reduce Slots</td>
- <td colspan="2">{stats.totalReduceSlots}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
+<div class="row">
+ <div class="col-xs-12">
+ <h4>Resources</h4>
+ <table class="table table-bordered table-condensed table-striped">
+ <thead>
+ <tr>
+ <th class="property-key">Resource</th>
+ <th class="property-key">Value</th>
+ <th>Job Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="property-key">Max Map Slots</td>
+ <td>{stats.mapSlots.max}</td>
+ <td>{stats.mapSlots.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max Reduce Slots</td>
+ <td>{stats.reduceSlots.max}</td>
+ <td>{stats.reduceSlots.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Total Map Slots</td>
+ <td colspan="2">{stats.totalMapSlots}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Total Reduce Slots</td>
+ <td colspan="2">{stats.totalReduceSlots}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
- <div class="row">
- <div class="col-xs-12">
- <h4>Parameters</h4>
- <table class="table table-bordered table-condensed table-striped">
- <thead>
- <tr>
- <th class="property-key">Parameter</th>
- <th class="property-key">Value</th>
- <th>Job Name</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="property-key">Max <code>-Xmx</code></td>
- <td>{stats.xmx.str}</td>
- <td>{stats.xmx.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max <code>-Xms</code></td>
- {?stats.xms.set}
- <td>
- {stats.xms.str}
- </td>
- <td>
- {stats.xms.job}
- </td>
- {:else}
- <td colspan="2">
- Not set.
- </td>
- {/stats.xms.set}
- </tr>
- <tr>
- <td class="property-key">Max <code>mapred.job.map.memory.mb</code></td>
- <td>{stats.jobMapMemoryMb.max}</td>
- <td>{stats.jobMapMemoryMb.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max <code>mapred.job.reduce.memory.mb</code></td>
- <td>{stats.jobReduceMemoryMb.max}</td>
- <td>{stats.jobReduceMemoryMb.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max Distributed Cache</td>
- {?stats.distributedCache.using}
- <td>
- {stats.distributedCache.max}
- </td>
- <td>
- {stats.distributedCache.job}
- </td>
- {:else}
- <td colspan="2">
- Not used.
- </td>
- {/stats.distributedCache.using}
- </tr>
- </tbody>
- </table>
- </div>
- </div>
+<div class="row">
+ <div class="col-xs-12">
+ <h4>Parameters</h4>
+ <table class="table table-bordered table-condensed table-striped">
+ <thead>
+ <tr>
+ <th class="property-key">Parameter</th>
+ <th class="property-key">Value</th>
+ <th>Job Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="property-key">Max <code>-Xmx</code></td>
+ <td>{stats.xmx.str}</td>
+ <td>{stats.xmx.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>-Xms</code></td>
+ {?stats.xms.set}
+ <td>
+ {stats.xms.str}
+ </td>
+ <td>
+ {stats.xms.job}
+ </td>
+ {:else}
+ <td colspan="2">
+ Not set.
+ </td>
+ {/stats.xms.set}
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>mapred.job.map.memory.mb</code></td>
+ <td>{stats.jobMapMemoryMb.max}</td>
+ <td>{stats.jobMapMemoryMb.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>mapred.job.reduce.memory.mb</code></td>
+ <td>{stats.jobReduceMemoryMb.max}</td>
+ <td>{stats.jobReduceMemoryMb.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max Distributed Cache</td>
+ {?stats.distributedCache.using}
+ <td>
+ {stats.distributedCache.max}
+ </td>
+ <td>
+ {stats.distributedCache.job}
+ </td>
+ {:else}
+ <td colspan="2">
+ Not used.
+ </td>
+ {/stats.distributedCache.using}
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
- <div class="row">
- <div class="col-xs-12">
- <h4>Counters</h4>
- <table class="table table-bordered table-condensed">
- <thead>
- <tr>
- <th class="property-key">Parameter</th>
- <th class="property-key">Value</th>
- <th>Job Name</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="property-key">Max <code>FILE_BYTES_READ</code></td>
- <td>{stats.fileBytesRead.max}</td>
- <td>{stats.fileBytesRead.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max <code>HDFS_BYTES_READ</code></td>
- <td>{stats.hdfsBytesRead.max}</td>
- <td>{stats.hdfsBytesRead.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max <code>FILE_BYTES_WRITTEN</code></td>
- <td>{stats.fileBytesWritten.max}</td>
- <td>{stats.fileBytesWritten.job}</td>
- </tr>
- <tr>
- <td class="property-key">Max <code>HDFS_BYTES_WRITTEN</code></td>
- <td>{stats.hdfsBytesWritten.max}</td>
- <td>{stats.hdfsBytesWritten.job}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
+<div class="row">
+ <div class="col-xs-12">
+ <h4>Counters</h4>
+ <table class="table table-bordered table-condensed">
+ <thead>
+ <tr>
+ <th class="property-key">Parameter</th>
+ <th class="property-key">Value</th>
+ <th>Job Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="property-key">Max <code>FILE_BYTES_READ</code></td>
+ <td>{stats.fileBytesRead.max}</td>
+ <td>{stats.fileBytesRead.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>HDFS_BYTES_READ</code></td>
+ <td>{stats.hdfsBytesRead.max}</td>
+ <td>{stats.hdfsBytesRead.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>FILE_BYTES_WRITTEN</code></td>
+ <td>{stats.fileBytesWritten.max}</td>
+ <td>{stats.fileBytesWritten.job}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Max <code>HDFS_BYTES_WRITTEN</code></td>
+ <td>{stats.hdfsBytesWritten.max}</td>
+ <td>{stats.hdfsBytesWritten.job}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
diff --git a/azkaban-web-server/src/main/tl/flowstats-no-data.tl b/azkaban-web-server/src/main/tl/flowstats-no-data.tl
index fe74240..acc04c6 100644
--- a/azkaban-web-server/src/main/tl/flowstats-no-data.tl
+++ b/azkaban-web-server/src/main/tl/flowstats-no-data.tl
@@ -1,8 +1,8 @@
- <div class="row">
- <div class="col-xs-12">
- <div class="callout callout-default">
- <h4>No Flow Stats Available</h4>
- <p>{message}</p>
- </div>
- </div>
- </div>
+<div class="row">
+ <div class="col-xs-12">
+ <div class="callout callout-default">
+ <h4>No Flow Stats Available</h4>
+ <p>{message}</p>
+ </div>
+ </div>
+</div>
azkaban-web-server/src/main/tl/flowsummary.tl 161(+83 -78)
diff --git a/azkaban-web-server/src/main/tl/flowsummary.tl b/azkaban-web-server/src/main/tl/flowsummary.tl
index 7632f72..74e40bd 100644
--- a/azkaban-web-server/src/main/tl/flowsummary.tl
+++ b/azkaban-web-server/src/main/tl/flowsummary.tl
@@ -1,84 +1,89 @@
- <div class="row">
- <div class="col-xs-12">
- <table class="table table-bordered table-condensed">
- <tbody>
- <tr>
- <td class="property-key">Project name</td>
- <td>{projectName}</td>
- </tr>
- <tr>
- <td class="property-key">Job Types Used</td>
- <td>{#jobTypes}{.} {/jobTypes}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
+<div class="row">
+ <div class="col-xs-12">
+ <table class="table table-bordered table-condensed">
+ <tbody>
+ <tr>
+ <td class="property-key">Project name</td>
+ <td>{projectName}</td>
+ </tr>
+ <tr>
+ <td class="property-key">Job Types Used</td>
+ <td>{#jobTypes}{.} {/jobTypes}</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+</div>
- <div class="row">
- <div class="col-xs-12">
- <h3>
- Scheduling
- {?schedule}
- <div class="pull-right">
- <button type="button" id="removeSchedBtn" class="btn btn-sm btn-danger" onclick="removeSched({schedule.scheduleId})" >Remove Schedule</button>
- </div>
- {/schedule}
- </h3>
- {?schedule}
- <table class="table table-condensed table-bordered">
- <tbody>
- <tr>
- <td class="property-key">Schedule ID</td>
- <td class="property-value-half">{schedule.scheduleId}</td>
- <td class="property-key">Submitted By</td>
- <td class="property-value-half">{schedule.submitUser}</td>
- </tr>
- <tr>
- <td class="property-key">First Scheduled to Run</td>
- <td class="property-value-half">{schedule.firstSchedTime}</td>
+<div class="row">
+ <div class="col-xs-12">
+ <h3>
+ Scheduling
+ {?schedule}
+ <div class="pull-right">
+ <button type="button" id="removeSchedBtn" class="btn btn-sm btn-danger"
+ onclick="removeSched({schedule.scheduleId})">Remove Schedule
+ </button>
+ </div>
+ {/schedule}
+ </h3>
+ {?schedule}
+ <table class="table table-condensed table-bordered">
+ <tbody>
+ <tr>
+ <td class="property-key">Schedule ID</td>
+ <td class="property-value-half">{schedule.scheduleId}</td>
+ <td class="property-key">Submitted By</td>
+ <td class="property-value-half">{schedule.submitUser}</td>
+ </tr>
+ <tr>
+ <td class="property-key">First Scheduled to Run</td>
+ <td class="property-value-half">{schedule.firstSchedTime}</td>
- <td class="property-key">
- {?schedule.cronExpression}
- Cron Expression
- {:else}
- Repeats Every
- {/schedule.cronExpression}
- </td>
+ <td class="property-key">
+ {?schedule.cronExpression}
+ Cron Expression
+ {:else}
+ Repeats Every
+ {/schedule.cronExpression}
+ </td>
- <td class="property-value-half">
- {?schedule.cronExpression}
- {schedule.cronExpression}
- {:else}
- {schedule.period}
- {/schedule.cronExpression}
- </td>
+ <td class="property-value-half">
+ {?schedule.cronExpression}
+ {schedule.cronExpression}
+ {:else}
+ {schedule.period}
+ {/schedule.cronExpression}
+ </td>
- </tr>
- <tr>
- <td class="property-key">Next Execution Time</td>
- <td class="property-value-half">{schedule.nextExecTime}</td>
- <td class="property-key">SLA</td>
- <td class="property-value-half">
- {?schedule.slaOptions}
- true
- {:else}
- false
- {/schedule.slaOptions}
- <div class="pull-right">
- <button type="button" id="addSlaBtn" class="btn btn-xs btn-primary" onclick="slaView.initFromSched({schedule.scheduleId}, '{flowName}')" >View/Set SLA</button>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- {:else}
- <div class="callout callout-default">
- <h4>None</h4>
- <p>This flow has not been scheduled.</p>
+ </tr>
+ <tr>
+ <td class="property-key">Next Execution Time</td>
+ <td class="property-value-half">{schedule.nextExecTime}</td>
+ <td class="property-key">SLA</td>
+ <td class="property-value-half">
+ {?schedule.slaOptions}
+ true
+ {:else}
+ false
+ {/schedule.slaOptions}
+ <div class="pull-right">
+ <button type="button" id="addSlaBtn" class="btn btn-xs btn-primary"
+ onclick="slaView.initFromSched({schedule.scheduleId}, '{flowName}')">View/Set
+ SLA
+ </button>
</div>
- {/schedule}
-
- <h3>Last Run Stats</h3>
- </div>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ {:else}
+ <div class="callout callout-default">
+ <h4>None</h4>
+ <p>This flow has not been scheduled.</p>
</div>
+ {/schedule}
+
+ <h3>Last Run Stats</h3>
+ </div>
+</div>
diff --git a/azkaban-web-server/src/restli/schemas/azkaban/restli/user/User.pdsc b/azkaban-web-server/src/restli/schemas/azkaban/restli/user/User.pdsc
index 156b380..ee534ad 100644
--- a/azkaban-web-server/src/restli/schemas/azkaban/restli/user/User.pdsc
+++ b/azkaban-web-server/src/restli/schemas/azkaban/restli/user/User.pdsc
@@ -4,7 +4,15 @@
"namespace": "azkaban.restli.user",
"doc": "Azkaban User restli info",
"fields": [
- {"name": "userId", "type": "string","doc": "The username this session"},
- {"name": "email", "type": "string","doc": "User email"}
+ {
+ "name": "userId",
+ "type": "string",
+ "doc": "The username this session"
+ },
+ {
+ "name": "email",
+ "type": "string",
+ "doc": "User email"
+ }
]
-}
\ No newline at end of file
+}
diff --git a/azkaban-web-server/src/test/expected/project-side-bar.html b/azkaban-web-server/src/test/expected/project-side-bar.html
index 904cadc..ca405a3 100644
--- a/azkaban-web-server/src/test/expected/project-side-bar.html
+++ b/azkaban-web-server/src/test/expected/project-side-bar.html
@@ -1,25 +1,26 @@
<html>
- <div class="well" id="project-sidebar">
- <h3>test_project</h3>
- <p class="editable" id="project-description"><script>window.alert("hacked")</script></p>
- <div id="project-description-form" class="editable-form">
- <div class="input-group">
- <input type="text" class="form-control input-sm" id="project-description-edit" placeholder="Project description">
- <span class="input-group-btn">
+<div class="well" id="project-sidebar">
+ <h3>test_project</h3>
+ <p class="editable" id="project-description"><script>window.alert("hacked")</script></p>
+ <div id="project-description-form" class="editable-form">
+ <div class="input-group">
+ <input type="text" class="form-control input-sm" id="project-description-edit"
+ placeholder="Project description">
+ <span class="input-group-btn">
<button class="btn btn-primary btn-sm" type="button" id="project-description-btn">Save</button>
</span>
- </div>
- </div>
- <hr>
- <p><strong>Created on</strong> 1999-06-07 08:09:10</p>
- <p><strong>Last modified by</strong> 2000-01-02 03:04:05</p>
- <p><strong>Modified by</strong> last_modified_user_name</p>
+ </div>
+ </div>
+ <hr>
+ <p><strong>Created on</strong> 1999-06-07 08:09:10</p>
+ <p><strong>Last modified by</strong> 2000-01-02 03:04:05</p>
+ <p><strong>Modified by</strong> last_modified_user_name</p>
- <hr>
+ <hr>
- <p><strong>Project admins:</strong> admin_name</p>
- <p><strong>Your Permissions:</strong> admin_permission</p>
- </div>
+ <p><strong>Project admins:</strong> admin_name</p>
+ <p><strong>Your Permissions:</strong> admin_permission</p>
+</div>
</html>
diff --git a/azkaban-web-server/src/test/java/azkaban/fixture/FileAssertion.java b/azkaban-web-server/src/test/java/azkaban/fixture/FileAssertion.java
index f71eeac..6896743 100644
--- a/azkaban-web-server/src/test/java/azkaban/fixture/FileAssertion.java
+++ b/azkaban-web-server/src/test/java/azkaban/fixture/FileAssertion.java
@@ -33,8 +33,8 @@ public class FileAssertion {
/**
* Return the html based content surrounded with the HTML tag.
*
- * This is useful to compare a fragment of HTML content with a proper expected HTML file
- * so that the expected file can be viewed more easily with a browser.
+ * This is useful to compare a fragment of HTML content with a proper expected HTML file so that
+ * the expected file can be viewed more easily with a browser.
*
* @param content the content
* @return string
diff --git a/azkaban-web-server/src/test/java/azkaban/fixture/VelocityTemplateTestUtil.java b/azkaban-web-server/src/test/java/azkaban/fixture/VelocityTemplateTestUtil.java
index afd8465..25f45be 100644
--- a/azkaban-web-server/src/test/java/azkaban/fixture/VelocityTemplateTestUtil.java
+++ b/azkaban-web-server/src/test/java/azkaban/fixture/VelocityTemplateTestUtil.java
@@ -29,7 +29,6 @@ public class VelocityTemplateTestUtil {
}
/**
- *
* @param source the rendered template as a String
* @param target the String fragment within the template
* @return - boolean
diff --git a/azkaban-web-server/src/test/java/azkaban/restli/DeployProjectTest.java b/azkaban-web-server/src/test/java/azkaban/restli/DeployProjectTest.java
index 8d5abe4..1add124 100644
--- a/azkaban-web-server/src/test/java/azkaban/restli/DeployProjectTest.java
+++ b/azkaban-web-server/src/test/java/azkaban/restli/DeployProjectTest.java
@@ -25,14 +25,13 @@ import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
-import org.junit.Test;
import org.junit.Assert;
+import org.junit.Test;
/**
- * Test response to deploy with either warn or error reports.
- * If a report has any errors, a RestLiServiceException should be thrown.
- * Warnings should not elicit an exception.
- * If an exception does get raised, it should carry an HTTP 400 status
+ * Test response to deploy with either warn or error reports. If a report has any errors, a
+ * RestLiServiceException should be thrown. Warnings should not elicit an exception. If an exception
+ * does get raised, it should carry an HTTP 400 status
*/
public class DeployProjectTest {
diff --git a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ExecutionFlowViewTest.java b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ExecutionFlowViewTest.java
index 2771c33..e6aa9fc 100644
--- a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ExecutionFlowViewTest.java
+++ b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ExecutionFlowViewTest.java
@@ -18,8 +18,7 @@ public class ExecutionFlowViewTest {
+ "title=\"Analyze job in Dr. Elephant\">Dr. Elephant</a></li>";
/**
- * Test aims to check that the external analyzer button is displayed
- * in the page.
+ * Test aims to check that the external analyzer button is displayed in the page.
*
* @throws Exception the exception
*/
diff --git a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/LoginAbstractAzkabanServletTest.java b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/LoginAbstractAzkabanServletTest.java
index d50de73..8837ce9 100644
--- a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/LoginAbstractAzkabanServletTest.java
+++ b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/LoginAbstractAzkabanServletTest.java
@@ -185,8 +185,8 @@ public class LoginAbstractAzkabanServletTest {
}
/**
- * Simulates users passing username/password via URI
- * where it would be logged by Azkaban Web Server
+ * Simulates users passing username/password via URI where it would be logged by Azkaban Web
+ * Server
*/
@Test
public void testLoginRevealingCredentialsShouldThrowFailure() throws Exception {
diff --git a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/PageUtilsTest.java b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/PageUtilsTest.java
index 94c1f5b..d8eea82 100644
--- a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/PageUtilsTest.java
+++ b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/PageUtilsTest.java
@@ -19,10 +19,11 @@ import org.junit.Test;
public class PageUtilsTest {
+
@Test
public void testUploadButtonisHiddenWhenGlobalPropertyIsSet()
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException,
- ClassNotFoundException, InstantiationException, IOException {
+ ClassNotFoundException, InstantiationException, IOException {
final HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
final HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
final User user = TestUtils.getTestUser();
diff --git a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ProjectPageHeaderTest.java b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ProjectPageHeaderTest.java
index e4e8cbf..9a1799b 100644
--- a/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ProjectPageHeaderTest.java
+++ b/azkaban-web-server/src/test/java/azkaban/webapp/servlet/ProjectPageHeaderTest.java
@@ -11,6 +11,7 @@ import org.junit.Test;
* Test validates the enable/disable feature of the 'Upload' button
*/
public class ProjectPageHeaderTest {
+
private static final String UPLOAD_BUTTON
= "<button id=\"project-upload-btn\" class=\"btn btn-sm btn-primary\">"
+ "<span class=\"glyphicon glyphicon-upload\"></span> Upload </button>";
diff --git a/azkaban-web-server/src/test/resources/azkaban-users.xml b/azkaban-web-server/src/test/resources/azkaban-users.xml
index a13035d..0df8fd1 100644
--- a/azkaban-web-server/src/test/resources/azkaban-users.xml
+++ b/azkaban-web-server/src/test/resources/azkaban-users.xml
@@ -1,7 +1,7 @@
<azkaban-users>
- <user username="azkaban" password="azkaban" roles="admin" groups="azkaban" />
- <user username="metrics" password="metrics" roles="metrics"/>
+ <user groups="azkaban" password="azkaban" roles="admin" username="azkaban"/>
+ <user password="metrics" roles="metrics" username="metrics"/>
- <role name="admin" permissions="ADMIN" />
- <role name="metrics" permissions="METRICS"/>
+ <role name="admin" permissions="ADMIN"/>
+ <role name="metrics" permissions="METRICS"/>
</azkaban-users>
diff --git a/azkaban-web-server/src/test/resources/log4j.properties b/azkaban-web-server/src/test/resources/log4j.properties
index 182c9a1..8d0943f 100644
--- a/azkaban-web-server/src/test/resources/log4j.properties
+++ b/azkaban-web-server/src/test/resources/log4j.properties
@@ -1,7 +1,5 @@
log4j.rootLogger=INFO, Console
-
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss.SSS Z} %p [%c{1}] %m%n
-
-log4j.category.velocity=INFO
\ No newline at end of file
+log4j.category.velocity=INFO
diff --git a/azkaban-web-server/src/test/resources/velocity.properties b/azkaban-web-server/src/test/resources/velocity.properties
index 0d16fe7..0eb08bf 100644
--- a/azkaban-web-server/src/test/resources/velocity.properties
+++ b/azkaban-web-server/src/test/resources/velocity.properties
@@ -1,7 +1,6 @@
-resource.loader = file
-
-file.resource.loader.description = Velocity File Resource Loader
-file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
-file.resource.loader.path = src/main/resources/
-file.resource.loader.cache = true
-file.resource.loader.modificationCheckInterval = 10
+resource.loader=file
+file.resource.loader.description=Velocity File Resource Loader
+file.resource.loader.class=org.apache.velocity.runtime.resource.loader.FileResourceLoader
+file.resource.loader.path=src/main/resources/
+file.resource.loader.cache=true
+file.resource.loader.modificationCheckInterval=10