1package autotest.afe.create;
2
3import autotest.afe.CheckBoxPanel;
4import autotest.afe.CheckBoxPanelDisplay;
5import autotest.afe.ControlTypeSelect;
6import autotest.afe.ControlTypeSelectDisplay;
7import autotest.afe.HostSelector;
8import autotest.afe.HostSelectorDisplay;
9import autotest.afe.IButton;
10import autotest.afe.IButton.ButtonImpl;
11import autotest.afe.ICheckBox;
12import autotest.afe.ICheckBox.CheckBoxImpl;
13import autotest.afe.ITextArea;
14import autotest.afe.ITextArea.TextAreaImpl;
15import autotest.afe.ITextBox;
16import autotest.afe.ITextBox.TextBoxImpl;
17import autotest.afe.RadioChooser;
18import autotest.afe.RadioChooserDisplay;
19import autotest.afe.TestSelector;
20import autotest.afe.TestSelectorDisplay;
21import autotest.common.ui.ExtendedListBox;
22import autotest.common.ui.SimplifiedList;
23import autotest.common.ui.ToolTip;
24
25import com.google.gwt.event.dom.client.HasClickHandlers;
26import com.google.gwt.event.logical.shared.HasCloseHandlers;
27import com.google.gwt.event.logical.shared.HasOpenHandlers;
28import com.google.gwt.user.client.ui.Anchor;
29import com.google.gwt.user.client.ui.Button;
30import com.google.gwt.user.client.ui.CheckBox;
31import com.google.gwt.user.client.ui.DisclosurePanel;
32import com.google.gwt.user.client.ui.FlexTable;
33import com.google.gwt.user.client.ui.HTMLPanel;
34import com.google.gwt.user.client.ui.HTMLTable;
35import com.google.gwt.user.client.ui.HasText;
36import com.google.gwt.user.client.ui.HasValue;
37import com.google.gwt.user.client.ui.HorizontalPanel;
38import com.google.gwt.user.client.ui.Label;
39import com.google.gwt.user.client.ui.Panel;
40import com.google.gwt.user.client.ui.TextBox;
41import com.google.gwt.user.client.ui.VerticalPanel;
42
43public class CreateJobViewDisplay implements CreateJobViewPresenter.Display {
44    public static final int CHECKBOX_PANEL_COLUMNS = 5;
45
46    private TextBox jobName = new TextBox();
47    private ToolTip jobNameToolTip = new ToolTip(
48        "?",
49        "Name for the job. The string should be meaningful when viewing a list of jobs.");
50    private ExtendedListBox priorityList = new ExtendedListBox();
51    private ToolTip priorityListToolTip = new ToolTip(
52        "?",
53        "Lowest to highest: Weekly, Daily, PostBuild, Default.");
54    private TextBoxImpl image_url = new TextBoxImpl();
55    private ToolTip image_urlToolTip = new ToolTip(
56        "?",
57        "Name of the test image to use. Example: \"x86-alex-release/R27-3837.0.0\". " +
58        "If no image is specified, regular tests will use current image on the Host. " +
59        "Please note that an image is required to run a test suite.");
60    /**
61     * - When the fetch tests from build checkbox is unchecked (by default), the tests
62     * selection dropdown list is filled up by using the build on Moblab device.
63     * - You can only check the checkbox if a build is selected in the test source build
64     * dropdown list
65     * - Whenever the source build dropdown selection changes, automatically switch back
66     * to fetch tests from Moblab device.
67     */
68    private CheckBoxImpl fetchTestsCheckBox = new CheckBoxImpl("Fetch Tests from Build");
69    private TextBox timeout = new TextBox();
70    private ToolTip timeoutToolTip = new ToolTip(
71        "?",
72        "The number of minutes after the job creation before the scheduler " +
73        "automatically aborts an incomplete job.");
74    private TextBox maxRuntime = new TextBox();
75    private ToolTip maxRuntimeToolTip = new ToolTip(
76        "?",
77        "The number of minutes after the job starts running before the scheduler " +
78        "automatically aborts an incomplete job.");
79    private TextBox testRetry = new TextBox();
80    private ToolTip testRetryToolTip = new ToolTip(
81        "?",
82        "Number of times to retry test if the test did not complete successfully.");
83    private TextBox emailList = new TextBox();
84    private ToolTip emailListToolTip = new ToolTip(
85        "?",
86        "Email addresses to notify when this job completes. " +
87        "Use a comma or space to separate multiple addresses.");
88    private CheckBoxImpl skipVerify = new CheckBoxImpl();
89    private ToolTip skipVerifyToolTip = new ToolTip(
90        "?",
91        "Skips the host verification step before running the job. " +
92        "This is useful for machine reinstalls, for example.");
93    private CheckBoxImpl skipReset = new CheckBoxImpl();
94    private ToolTip skipResetToolTip = new ToolTip(
95        "?",
96        "Skips the host reset step before running the job.");
97    private RadioChooserDisplay rebootBefore = new RadioChooserDisplay();
98    private ToolTip rebootBeforeToolTip = new ToolTip(
99        "?",
100        "Reboots all assigned hosts before the job runs. " +
101        "Click If dirty to reboot the host only if it hasn’t been rebooted " +
102        "since it was added, locked, or after running the last job.");
103    private RadioChooserDisplay rebootAfter = new RadioChooserDisplay();
104    private ToolTip rebootAfterToolTip = new ToolTip(
105        "?",
106        "Reboots all assigned hosts after the job runs. Click If all tests passed " +
107        "to skip rebooting the host if any test in the job fails.");
108    private CheckBox parseFailedRepair = new CheckBox();
109    private ToolTip parseFailedRepairToolTip = new ToolTip(
110        "?",
111        "When a host fails repair, displays repair and verify test entries in " +
112        "the results database along with a SERVER_JOB entry. " +
113        "Otherwise, no information is displayed in TKO (Result Database).");
114    private CheckBoxImpl hostless = new CheckBoxImpl();
115    private ToolTip hostlessToolTip = new ToolTip(
116        "?",
117        "Check to run a suite of tests, and select Server from the Test type dropdown list.");
118    private CheckBoxImpl require_ssp = new CheckBoxImpl();
119    private ToolTip require_sspToolTip = new ToolTip(
120        "?",
121        "Check to force a server side test to use server-side packaging. This " +
122        "option has no effect on suite job. Test jobs created by a suite job " +
123        "will use SSP if enable_ssp_container is set to True in global config " +
124        "and there exists a drone supporting SSP.");
125    private TextBox pool = new TextBox();
126    private ToolTip poolToolTip = new ToolTip(
127        "?",
128        "Specify the pool of machines to use for suite job.");
129    private TextBoxImpl args = new TextBoxImpl();
130    private ToolTip argsToolTip = new ToolTip(
131        "?",
132        "Example: \"device_addrs=00:1F:20:33:6A:1E, arg2=value2, arg3=value3\". " +
133        "Separate multiple args with commas.");
134    private TextBoxImpl firmwareRWBuild = new TextBoxImpl();
135    private ToolTip firmwareRWBuildToolTip = new ToolTip(
136        "?",
137        "Name of the firmware build to update RW firmware of the DUT. Example: " +
138        "\"x86-alex-firmware/R41-6588.9.0\". If no firmware build is specified, " +
139        "the RW firmware of the DUT will not be updated.");
140    private TextBoxImpl firmwareROBuild = new TextBoxImpl();
141    private ToolTip firmwareROBuildToolTip = new ToolTip(
142        "?",
143        "Name of the firmware build to update RO firmware of the DUT. Example: " +
144        "\"x86-alex-firmware/R41-6588.9.0\". If no firmware RO build is specified, " +
145        "the RO firmware of the DUT will not be updated.");
146    private ExtendedListBox testSourceBuildList = new ExtendedListBox();
147    private ToolTip testSourceBuildListToolTip = new ToolTip(
148        "?",
149        "The image/build from which the tests will be fetched and ran from. It can " +
150        "be one of the specified Build Image, Firmware RW Build or the Firmware RO Build.");
151    private TestSelectorDisplay testSelector = new TestSelectorDisplay();
152    private CheckBoxPanelDisplay profilersPanel = new CheckBoxPanelDisplay(CHECKBOX_PANEL_COLUMNS);
153    private CheckBoxImpl runNonProfiledIteration =
154        new CheckBoxImpl("Run each test without profilers first");
155    private ExtendedListBox droneSet = new ExtendedListBox();
156    private TextAreaImpl controlFile = new TextAreaImpl();
157    private DisclosurePanel controlFilePanel = new DisclosurePanel("");
158    private ControlTypeSelectDisplay controlTypeSelect = new ControlTypeSelectDisplay();
159    private TextBoxImpl synchCountInput = new TextBoxImpl();
160    private ButtonImpl editControlButton = new ButtonImpl();
161    private HostSelectorDisplay hostSelector = new HostSelectorDisplay();
162    private ButtonImpl submitJobButton = new ButtonImpl("Submit Job");
163    private Button createTemplateJobButton = new Button("Create Template Job");
164    private Button resetButton = new Button("Reset");
165    private Label viewLink = new Label("");
166    private DisclosurePanel advancedOptionsPanel = new DisclosurePanel("");
167    private DisclosurePanel firmwareBuildOptionsPanel = new DisclosurePanel("");
168
169    public void initialize(HTMLPanel panel) {
170        jobName.addStyleName("jobname-image-boundedwidth");
171        image_url.addStyleName("jobname-image-boundedwidth");
172
173        Panel profilerControls = new VerticalPanel();
174        profilerControls.add(profilersPanel);
175        profilerControls.add(runNonProfiledIteration);
176
177        controlFile.setSize("100%", "30em");
178
179        HorizontalPanel controlOptionsPanel = new HorizontalPanel();
180        controlOptionsPanel.setVerticalAlignment(HorizontalPanel.ALIGN_BOTTOM);
181        controlOptionsPanel.add(controlTypeSelect);
182        Label useLabel = new Label("Use");
183        useLabel.getElement().getStyle().setProperty("marginLeft", "1em");
184        synchCountInput.setSize("3em", ""); // set width only
185        synchCountInput.getElement().getStyle().setProperty("margin", "0 0.5em 0 0.5em");
186        controlOptionsPanel.add(useLabel);
187        controlOptionsPanel.add(synchCountInput);
188        controlOptionsPanel.add(new Label("host(s) per execution"));
189        Panel controlEditPanel = new VerticalPanel();
190        controlEditPanel.add(controlOptionsPanel);
191        controlEditPanel.add(controlFile);
192        controlEditPanel.setWidth("100%");
193
194        Panel controlHeaderPanel = new HorizontalPanel();
195        controlHeaderPanel.add(controlFilePanel.getHeader());
196        controlHeaderPanel.add(viewLink);
197        controlHeaderPanel.add(editControlButton);
198
199        controlFilePanel.setHeader(controlHeaderPanel);
200        controlFilePanel.add(controlEditPanel);
201        controlFilePanel.addStyleName("panel-boundedwidth");
202
203        // Setup the Advanced options panel
204        advancedOptionsPanel.getHeaderTextAccessor().setText("Advanced Options");
205
206        FlexTable advancedOptionsLayout = new FlexTable();
207
208        Panel priorityPanel = new HorizontalPanel();
209        priorityPanel.add(priorityList);
210        priorityPanel.add(priorityListToolTip);
211        advancedOptionsLayout.setWidget(0, 0, new Label("Priority:"));
212        advancedOptionsLayout.setWidget(0, 1, priorityPanel);
213
214        Panel timeoutPanel = new HorizontalPanel();
215        timeoutPanel.add(timeout);
216        timeoutPanel.add(timeoutToolTip);
217        advancedOptionsLayout.setWidget(3, 0, new Label("Timeout (minutes):"));
218        advancedOptionsLayout.setWidget(3, 1, timeoutPanel);
219
220        Panel maxRuntimePanel = new HorizontalPanel();
221        maxRuntimePanel.add(maxRuntime);
222        maxRuntimePanel.add(maxRuntimeToolTip);
223        advancedOptionsLayout.setWidget(4, 0, new Label("Max runtime (minutes):"));
224        advancedOptionsLayout.setWidget(4, 1, maxRuntimePanel);
225
226        Panel testRetryPanel = new HorizontalPanel();
227        testRetryPanel.add(testRetry);
228        testRetryPanel.add(testRetryToolTip);
229        advancedOptionsLayout.setWidget(5, 0, new Label("Test Retries: (optional)"));
230        advancedOptionsLayout.setWidget(5, 1, testRetryPanel);
231
232        Panel emailListPanel = new HorizontalPanel();
233        emailListPanel.add(emailList);
234        emailListPanel.add(emailListToolTip);
235        advancedOptionsLayout.setWidget(6, 0, new Label("Email List: (optional)"));
236        advancedOptionsLayout.setWidget(6, 1, emailListPanel);
237
238        Panel skipVerifyPanel = new HorizontalPanel();
239        skipVerifyPanel.add(skipVerify);
240        skipVerifyPanel.add(skipVerifyToolTip);
241        advancedOptionsLayout.setWidget(7, 0, new Label("Skip verify:"));
242        advancedOptionsLayout.setWidget(7, 1, skipVerifyPanel);
243
244        Panel skipResetPanel = new HorizontalPanel();
245        skipResetPanel.add(skipReset);
246        skipResetPanel.add(skipResetToolTip);
247        advancedOptionsLayout.setWidget(8, 0, new Label("Skip reset:"));
248        advancedOptionsLayout.setWidget(8, 1, skipResetPanel);
249
250        Panel rebootBeforePanel = new HorizontalPanel();
251        rebootBeforePanel.add(rebootBefore);
252        rebootBeforePanel.add(rebootBeforeToolTip);
253        advancedOptionsLayout.setWidget(9, 0, new Label("Reboot before:"));
254        advancedOptionsLayout.setWidget(9, 1, rebootBeforePanel);
255
256        Panel rebootAfterPanel = new HorizontalPanel();
257        rebootAfterPanel.add(rebootAfter);
258        rebootAfterPanel.add(rebootAfterToolTip);
259        advancedOptionsLayout.setWidget(10, 0, new Label("Reboot after:"));
260        advancedOptionsLayout.setWidget(10, 1, rebootAfterPanel);
261
262        Panel parseFailedRepairPanel = new HorizontalPanel();
263        parseFailedRepairPanel.add(parseFailedRepair);
264        parseFailedRepairPanel.add(parseFailedRepairToolTip);
265        advancedOptionsLayout.setWidget(11, 0, new Label("Include failed repair results:"));
266        advancedOptionsLayout.setWidget(11, 1, parseFailedRepairPanel);
267
268        Panel hostlessPanel = new HorizontalPanel();
269        hostlessPanel.add(hostless);
270        hostlessPanel.add(hostlessToolTip);
271        advancedOptionsLayout.setWidget(12, 0, new Label("Hostless (Suite Job):"));
272        advancedOptionsLayout.setWidget(12, 1, hostlessPanel);
273
274        Panel require_sspPanel = new HorizontalPanel();
275        require_sspPanel.add(require_ssp);
276        require_sspPanel.add(require_sspToolTip);
277        advancedOptionsLayout.setWidget(13, 0, new Label("Require server-side packaging:"));
278        advancedOptionsLayout.setWidget(13, 1, require_sspPanel);
279
280        Panel poolPanel = new HorizontalPanel();
281        poolPanel.add(pool);
282        poolPanel.add(poolToolTip);
283        advancedOptionsLayout.setWidget(14, 0, new Label("Pool: (optional)"));
284        advancedOptionsLayout.setWidget(14, 1, poolPanel);
285
286        Panel argsPanel = new HorizontalPanel();
287        argsPanel.add(args);
288        argsPanel.add(argsToolTip);
289        advancedOptionsLayout.setWidget(15, 0, new Label("Args: (optional)"));
290        advancedOptionsLayout.setWidget(15, 1, argsPanel);
291
292        advancedOptionsLayout.setWidget(16, 0, new Label("Profilers: (optional)"));
293        advancedOptionsLayout.setWidget(16, 1, profilerControls);
294
295        HTMLTable.RowFormatter advOptLayoutFormatter = advancedOptionsLayout.getRowFormatter();
296        for (int row = 0; row < advancedOptionsLayout.getRowCount(); ++row)
297        {
298          if (row % 2 == 0) {
299              advOptLayoutFormatter.addStyleName(row, "data-row");
300          }
301          else {
302              advOptLayoutFormatter.addStyleName(row, "data-row-alternate");
303          }
304
305        }
306        advancedOptionsLayout.setWidth("100%");
307        advancedOptionsPanel.addStyleName("panel-boundedwidth");
308        advancedOptionsPanel.add(advancedOptionsLayout);
309
310        // Setup the Firmware Build options panel
311        firmwareBuildOptionsPanel.getHeaderTextAccessor().setText("Firmware Build Options (optional)");
312        FlexTable firmwareBuildOptionsLayout = new FlexTable();
313
314        firmwareBuildOptionsLayout.getFlexCellFormatter().setColSpan(0, 0, 2);
315        firmwareBuildOptionsLayout.setWidget(0, 0, new Label("Image URL/Build must be specified for " +
316            "updating the firmware of the test device with given firmware build. A servo may be " +
317            "required to be attached to the test device in order to have firmware updated."));
318
319        Panel firmwareRWBuildPanel = new HorizontalPanel();
320        firmwareRWBuild.addStyleName("jobname-image-boundedwidth");
321        firmwareRWBuildPanel.add(firmwareRWBuild);
322        firmwareRWBuildPanel.add(firmwareRWBuildToolTip);
323        firmwareBuildOptionsLayout.setWidget(1, 0, new Label("Firmware RW build:"));
324        firmwareBuildOptionsLayout.setWidget(1, 1, firmwareRWBuildPanel);
325
326        Panel firmwareROBuildPanel = new HorizontalPanel();
327        firmwareROBuild.addStyleName("jobname-image-boundedwidth");
328        firmwareROBuildPanel.add(firmwareROBuild);
329        firmwareROBuildPanel.add(firmwareROBuildToolTip);
330        firmwareBuildOptionsLayout.setWidget(2, 0, new Label("Firmware RO build:"));
331        firmwareBuildOptionsLayout.setWidget(2, 1, firmwareROBuildPanel);
332
333        firmwareBuildOptionsLayout.setWidth("100%");
334        firmwareBuildOptionsPanel.addStyleName("panel-boundedwidth");
335        firmwareBuildOptionsPanel.add(firmwareBuildOptionsLayout);
336        firmwareRWBuild.setEnabled(false);
337        firmwareROBuild.setEnabled(false);
338
339        testSourceBuildList.getElement().getStyle().setProperty("minWidth", "15em");
340
341        fetchTestsCheckBox.setEnabled(false);
342        // Add the remaining widgets to the main panel
343        panel.add(jobName, "create_job_name");
344        panel.add(jobNameToolTip, "create_job_name");
345        panel.add(image_url, "create_image_url");
346        panel.add(image_urlToolTip, "create_image_url");
347        panel.add(testSourceBuildList, "create_test_source_build");
348        panel.add(testSourceBuildListToolTip, "create_test_source_build");
349        panel.add(fetchTestsCheckBox, "fetch_tests_from_build");
350        panel.add(testSelector, "create_tests");
351        panel.add(controlFilePanel, "create_edit_control");
352        panel.add(hostSelector, "create_host_selector");
353        panel.add(submitJobButton, "create_submit");
354        panel.add(createTemplateJobButton, "create_template_job");
355        panel.add(resetButton, "create_reset");
356        panel.add(droneSet, "create_drone_set");
357
358        panel.add(advancedOptionsPanel, "create_advanced_options");
359        panel.add(firmwareBuildOptionsPanel, "create_firmware_build_options");
360    }
361
362    public CheckBoxPanel.Display getCheckBoxPanelDisplay() {
363        return profilersPanel;
364    }
365
366    public ControlTypeSelect.Display getControlTypeSelectDisplay() {
367        return controlTypeSelect;
368    }
369
370    public ITextArea getControlFile() {
371        return controlFile;
372    }
373
374    public HasCloseHandlers<DisclosurePanel> getControlFilePanelClose() {
375        return controlFilePanel;
376    }
377
378    public HasOpenHandlers<DisclosurePanel> getControlFilePanelOpen() {
379        return controlFilePanel;
380    }
381
382    public HasClickHandlers getCreateTemplateJobButton() {
383        return createTemplateJobButton;
384    }
385
386    public SimplifiedList getDroneSet() {
387        return droneSet;
388    }
389
390    public IButton getEditControlButton() {
391        return editControlButton;
392    }
393
394    public HasText getEmailList() {
395        return emailList;
396    }
397
398    public HostSelector.Display getHostSelectorDisplay() {
399        return hostSelector;
400    }
401
402    public ICheckBox getHostless() {
403        return hostless;
404    }
405
406    public ICheckBox getRequireSSP() {
407      return require_ssp;
408    }
409
410    public HasText getPool() {
411        return pool;
412    }
413
414    public ITextBox getArgs() {
415        return args;
416    }
417
418    public HasText getJobName() {
419        return jobName;
420    }
421
422    public ITextBox getImageUrl() {
423        return image_url;
424    }
425
426    public HasText getMaxRuntime() {
427        return maxRuntime;
428    }
429
430    public HasText getTestRetry() {
431        return testRetry;
432    }
433
434    public HasValue<Boolean> getParseFailedRepair() {
435        return parseFailedRepair;
436    }
437
438    public ExtendedListBox getPriorityList() {
439        return priorityList;
440    }
441
442    public RadioChooser.Display getRebootAfter() {
443        return rebootAfter;
444    }
445
446    public RadioChooser.Display getRebootBefore() {
447        return rebootBefore;
448    }
449
450    public HasClickHandlers getResetButton() {
451        return resetButton;
452    }
453
454    public ICheckBox getRunNonProfiledIteration() {
455        return runNonProfiledIteration;
456    }
457
458    public ICheckBox getSkipVerify() {
459        return skipVerify;
460    }
461
462    public ICheckBox getSkipReset() {
463      return skipReset;
464    }
465
466    public IButton getSubmitJobButton() {
467        return submitJobButton;
468    }
469
470    public ITextBox getSynchCountInput() {
471        return synchCountInput;
472    }
473
474    public TestSelector.Display getTestSelectorDisplay() {
475        return testSelector;
476    }
477
478    public HasText getTimeout() {
479        return timeout;
480    }
481
482    public HasText getViewLink() {
483        return viewLink;
484    }
485
486    public void setControlFilePanelOpen(boolean isOpen) {
487        controlFilePanel.setOpen(isOpen);
488    }
489
490    public ICheckBox getFetchTestsFromBuildCheckBox() {
491      return fetchTestsCheckBox;
492    }
493
494    public ITextBox getFirmwareRWBuild() {
495      return firmwareRWBuild;
496    }
497
498    public ITextBox getFirmwareROBuild() {
499      return firmwareROBuild;
500    }
501
502    public ExtendedListBox getTestSourceBuildList() {
503      return testSourceBuildList;
504    }
505}
506