Perf dashboard should automatically detect regressions
[WebKit-https.git] / Websites / perf.webkit.org / public / privileged-api / create-analysis-task.php
1 <?php
2
3 require_once('../include/json-header.php');
4
5 function main() {
6     $db = connect();
7     $data = ensure_privileged_api_data_and_token_or_slave($db);
8
9     $author = remote_user_name($data);
10     $name = array_get($data, 'name');
11     $start_run_id = array_get($data, 'startRun');
12     $end_run_id = array_get($data, 'endRun');
13
14     $segmentation_name = array_get($data, 'segmentationStrategy');
15     $test_range_name = array_get($data, 'testRangeStrategy');
16
17     if (!$name)
18         exit_with_error('MissingName', array('name' => $name));
19     $range = array('startRunId' => $start_run_id, 'endRunId' => $end_run_id);
20     if (!$start_run_id || !$end_run_id)
21         exit_with_error('MissingRange', $range);
22
23     $start_run = ensure_row_by_id($db, 'test_runs', 'run', $start_run_id, 'InvalidStartRun', $range);
24     $end_run = ensure_row_by_id($db, 'test_runs', 'run', $end_run_id, 'InvalidEndRun', $range);
25
26     $config = ensure_config_from_runs($db, $start_run, $end_run);
27
28     $db->begin_transaction();
29
30     $segmentation_id = NULL;
31     if ($segmentation_name) {
32         $segmentation_id = $db->select_or_insert_row('analysis_strategies', 'strategy', array('name' => $segmentation_name));
33         if (!$segmentation_id) {
34             $db->rollback_transaction();
35             exit_with_error('CannotFindOrInsertSegmentationStrategy', array('segmentationStrategy' => $segmentation_name));
36         }
37     }
38
39     $test_range_id = NULL;
40     if ($test_range_name) {
41         $test_range_id = $db->select_or_insert_row('analysis_strategies', 'strategy', array('name' => $test_range_name));
42         if (!$test_range_id) {
43             $db->rollback_transaction();
44             exit_with_error('CannotFindOrInsertTestRangeStrategy', array('testRangeStrategy' => $test_range_name));
45         }
46     }
47
48     $duplicate = $db->select_first_row('analysis_tasks', 'task', array('start_run' => $start_run_id, 'end_run' => $end_run_id));
49     if ($duplicate) {
50         $db->rollback_transaction();
51         exit_with_error('DuplicateAnalysisTask', array('duplicate' => $duplicate));
52     }
53
54     $task_id = $db->insert_row('analysis_tasks', 'task', array(
55         'name' => $name,
56         'author' => $author,
57         'platform' => $config['config_platform'],
58         'metric' => $config['config_metric'],
59         'start_run' => $start_run_id,
60         'end_run' => $end_run_id,
61         'segmentation' => $segmentation_id,
62         'test_range' => $test_range_id));
63     $db->commit_transaction();
64
65     exit_with_success(array('taskId' => $task_id));
66 }
67
68 function ensure_row_by_id($db, $table, $prefix, $id, $error_name, $error_params) {
69     $row = $db->select_first_row($table, $prefix, array('id' => $id));
70     if (!$row)
71         exit_with_error($error_name, array($error_params));
72     return $row;
73 }
74
75 function ensure_config_from_runs($db, $start_run, $end_run) {
76     $range = array('startRun' => $start_run, 'endRun' => $end_run);
77
78     if ($start_run['run_config'] != $end_run['run_config'])
79         exit_with_error('RunConfigMismatch', $range);
80
81     return ensure_row_by_id($db, 'test_configurations', 'config', $start_run['run_config'], 'ConfigNotFound', $range);
82 }
83
84 main();
85
86 ?>