[autotest] add retries field to create job view

A job created in the afe's create job tab can now have its test_retry
value specified. If the field in the afe is left blank, the number of
retries used is taken from the RETRIES value that was parsed from the
control file at test-import time (or the maximum of this value ot
over all the selected jobs, if multiple jobs are selected).

BUG=chromium-os:37158
TEST=Ran './utils/compile_gwt_clients.py -c autotest.AfeClient' to
recompile frontend. Then, 'sudo /etc/init.d/apache2 restart'. Verified
that the above behavior holds, and that the clone job button populates the
retry field with the value from the job to be cloned.

Change-Id: I6f28a0d9e1eb8a39fae0d1669bef846c65c99198
Reviewed-on: https://gerrit.chromium.org/gerrit/45164
Tested-by: Aviv Keshet <akeshet@chromium.org>
Reviewed-by: Simran Basi <sbasi@chromium.org>
Commit-Queue: Aviv Keshet <akeshet@chromium.org>
diff --git a/frontend/client/src/autotest/afe/create/CreateJobViewDisplay.java b/frontend/client/src/autotest/afe/create/CreateJobViewDisplay.java
index ab0019c..4fd2f79 100644
--- a/frontend/client/src/autotest/afe/create/CreateJobViewDisplay.java
+++ b/frontend/client/src/autotest/afe/create/CreateJobViewDisplay.java
@@ -47,6 +47,7 @@
     private TextBoxImpl image_url = new TextBoxImpl();
     private TextBox timeout = new TextBox();
     private TextBox maxRuntime = new TextBox();
+    private TextBox testRetry = new TextBox();
     private TextBox emailList = new TextBox();
     private CheckBoxImpl skipVerify = new CheckBoxImpl();
     private RadioChooserDisplay rebootBefore = new RadioChooserDisplay();
@@ -103,6 +104,7 @@
         panel.add(image_url, "create_image_url");
         panel.add(timeout, "create_timeout");
         panel.add(maxRuntime, "create_max_runtime");
+        panel.add(testRetry, "create_test_retry");
         panel.add(emailList, "create_email_list");
         panel.add(priorityList, "create_priority");
         panel.add(skipVerify, "create_skip_verify");
@@ -184,6 +186,10 @@
         return maxRuntime;
     }
 
+    public HasText getTestRetry() {
+        return testRetry;
+    }
+
     public HasValue<Boolean> getParseFailedRepair() {
         return parseFailedRepair;
     }
diff --git a/frontend/client/src/autotest/afe/create/CreateJobViewPresenter.java b/frontend/client/src/autotest/afe/create/CreateJobViewPresenter.java
index e0cf25c..6cabf3e 100644
--- a/frontend/client/src/autotest/afe/create/CreateJobViewPresenter.java
+++ b/frontend/client/src/autotest/afe/create/CreateJobViewPresenter.java
@@ -54,6 +54,8 @@
 import java.util.List;
 import java.util.Map;
 
+import java.lang.Math;
+
 public class CreateJobViewPresenter implements TestSelectorListener {
     public static interface Display {
         public CheckBoxPanel.Display getCheckBoxPanelDisplay();
@@ -64,6 +66,7 @@
         public SimplifiedList getPriorityList();
         public HasText getTimeout();
         public HasText getMaxRuntime();
+        public HasText getTestRetry();
         public HasText getEmailList();
         public ICheckBox getSkipVerify();
         public RadioChooser.Display getRebootBefore();
@@ -145,6 +148,7 @@
 
         display.getTimeout().setText(Utils.jsonToString(jobObject.get("timeout")));
         display.getMaxRuntime().setText(Utils.jsonToString(jobObject.get("max_runtime_mins")));
+        display.getTestRetry().setText(Utils.jsonToString(jobObject.get("test_retry")));
         display.getEmailList().setText(
                 jobObject.get("email_list").isString().stringValue());
 
@@ -358,6 +362,14 @@
         }
     }
 
+    protected int getMaximumRetriesCount() {
+        int maxRetries = 0;
+        for (JSONObject test : testSelector.getSelectedTests()) {
+            maxRetries = (int) Math.max(maxRetries, test.get("test_retry").isNumber().getValue());
+        }
+        return maxRetries;
+    }
+
     protected void setInputsEnabled() {
         testSelector.setEnabled(true);
         profilersPanel.setEnabled(true);
@@ -528,6 +540,7 @@
         display.getTimeout().setText(Utils.jsonToString(repository.getData("job_timeout_default")));
         display.getMaxRuntime().setText(
                 Utils.jsonToString(repository.getData("job_max_runtime_mins_default")));
+        display.getTestRetry().setText("");
         display.getEmailList().setText("");
         testSelector.reset();
         display.getSkipVerify().setValue(false);
@@ -547,12 +560,17 @@
     }
 
     private void submitJob(final boolean isTemplate) {
-        final int timeoutValue, maxRuntimeValue;
+        final int timeoutValue, maxRuntimeValue, testRetryValue;
         final JSONValue synchCount;
         try {
             timeoutValue = parsePositiveIntegerInput(display.getTimeout().getText(), "timeout");
             maxRuntimeValue = parsePositiveIntegerInput(
                     display.getMaxRuntime().getText(), "max runtime");
+            String testRetryText = display.getTestRetry().getText();
+            if (testRetryText == "")
+                testRetryValue = getMaximumRetriesCount();
+            else
+                testRetryValue = parsePositiveIntegerInput(testRetryText, "test retries");
 
             if (display.getHostless().getValue()) {
                 synchCount = JSONNull.getInstance();
@@ -580,6 +598,7 @@
                 args.put("synch_count", synchCount);
                 args.put("timeout", new JSONNumber(timeoutValue));
                 args.put("max_runtime_mins", new JSONNumber(maxRuntimeValue));
+                args.put("test_retry", new JSONNumber(testRetryValue));
                 args.put("email_list", new JSONString(display.getEmailList().getText()));
                 args.put("run_verify", JSONBoolean.getInstance(
                         !display.getSkipVerify().getValue()));
diff --git a/frontend/client/src/autotest/public/AfeClient.html b/frontend/client/src/autotest/public/AfeClient.html
index ae43b5c..a6c0028 100644
--- a/frontend/client/src/autotest/public/AfeClient.html
+++ b/frontend/client/src/autotest/public/AfeClient.html
@@ -131,6 +131,8 @@
               <td id="create_timeout"></td><td></td></tr>
           <tr><td class="field-name">Max runtime (minutes):</td>
               <td id="create_max_runtime"></td><td></td></tr>
+          <tr><td class="field-name">Test retries:</td>
+              <td id="create_test_retry"></td><td></td></tr>
           <tr><td class="field-name">Email List:</td>
               <td id="create_email_list"></td><td></td></tr>
           <tr><td class="field-name">Skip verify:</td>