Add a page to show the latest evaluations for the entire server

[?]
Feb 21, 2013, 4:27 PM
VH5ZABDRP565VZIG55YHNYYPST53NQ2J6YM362NSLXCAHI5WPH4AC

Dependencies

  • [2] JZVRK5QJ Group some menu items together under a "Status" menu
  • [3] TFK74CQR Put job status on a separate tab
  • [4] QL55ECJ6 - adapted ui for hydra, more in line with nixos.org website
  • [5] 6QRHXIM3 * Speed up the jobset index page. Especially the query to get the
  • [6] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [7] 4WZQW2N6 Fix indentation and get rid of some unnecessary whitespace in the output
  • [8] NEQ4BISO Add bootstrap.zip
  • [9] SZYDW2DG hydra: added some user admin
  • [10] UMFB2767 Hydra/64: Leaving number of builds empty gives DBIx error
  • [11] 2VBQRQ2Q Fix some XML well-formedness problems
  • [12] 3JBUMW3E forgot to commit a file
  • [13] KG5AMUMG Cleanup
  • [14] PZL3SZM3 Give every page a consistent title
  • [15] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [16] AFEKITYD Fix some warnings about undefined values
  • [17] HFJPPMTU Cleanup
  • [18] XDDCO6CH * hydra: add dependency list with links to logfiles
  • [19] AZCCANUB Missing part of aaacf9eda36f5cdcc77cec20d6f49fbb6f925105
  • [20] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [21] RWFCW6ZN In the jobset evals lists, show what inputs changed between consecutive evals
  • [22] PMNWRTGJ Add multiple output support
  • [23] Q4VDOA76 Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu.
  • [24] 2BUX775I * More release -> view.
  • [25] J5UVLXOK * Start of a basic Catalyst web interface.
  • [26] 6FRLEP4P first try for timeline of last 24 hours in hydra
  • [27] OR5SJ42Y Show releases in a tab on the project page
  • [28] KXGOUX7P * Creating releases.
  • [29] TRDGNILT Remove unused file
  • [30] OX6NYJDV Split viewing and editing a jobset
  • [31] BDSD2JLV * Speed up manifest generation.
  • [32] SMTMFEKE hydra: add missing templates
  • [33] 2AUODJBT
  • [34] L7NUCXKS Show new and removed jobs
  • [35] D6ET5EQ6 Doh
  • [36] 5EIPRLDD export logContents
  • [37] 3TL5XENE Different icons (darker red) for cancelled builds. Fixes #25.
  • [38] KJC7RKIE Speed up the jobset eval list a bit
  • [39] K22TMPH5 Make the info tables less compressed
  • [40] 5DSDXORD hydra: missing plain.tt
  • [41] RBNQKATL * Adding persistant releases. A release is a named set of builds.
  • [42] P5X4P6VK * Renaming "release sets" to "views" (not finished yet). Having
  • [43] WRIU3S5E * UI for cloning builds (not functional yet).
  • [44] FV2M6MOT hydra: use autoconf/-make
  • [45] JARRBLZD Bootstrapify the Hydra forms (except the project and jobset edit pages)
  • [46] EFWN7JBV * Added a status page that shows all the currently executing build steps.
  • [47] 2JQ7WEFM
  • [48] C2DCO6AS
  • [49] D5QIOJGP * Move everything up one directory.
  • [50] SMM4HQTP * Put actions related to builds under /build (e.g. /log/<buildid>
  • [51] 36M6DGIT Show the runtime/build dependencies in the build page
  • [52] 75XUS62Y * Added a page to quickly see all failed builds and failed evaluations
  • [53] RSEGBU6C Hydra/20: Jobset clone feature
  • [54] 3PNG7NIB Remove trailing whitespace
  • [55] TNMOG2ZQ Indentation
  • [56] HQGXL4MX Add validation for project and jobset names
  • [57] U4TD3AIQ Add support for viewing jobset evaluations
  • [58] JY7BXXOP Split viewing and editing a project
  • [59] AS2OXLRM * Editing releases.
  • [60] R2PON6R7 Allow non-admin users to see the machine status page
  • [*] 3HZY24CX * Make jobsets viewable under
  • [*] HRAFVVOE make logo configurable via HYDRA_LOGO env var
  • [*] 2GK5DOU7 * Downloading closures.
  • [*] IK53RV4V

Change contents

  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 52
    [4.1][3.0:53]()
    $c->stash->{evals} = getEvals($self, $c, 0, 10);
    [4.1]
    [4.4]
    $c->stash->{evals} = getEvals($self, $c, scalar $c->stash->{jobset}->jobsetevals, 0, 10);
  • edit in src/lib/Hydra/Controller/Jobset.pm at line 303
    [4.608][4.53:113](),[4.1555][4.53:113](),[4.113][4.1996:1997](),[4.1997][4.58:116](),[4.58][4.58:116](),[4.116][4.1998:2029](),[4.2029][4.0:74](),[4.200][4.0:74](),[4.74][4.158:177](),[4.158][4.158:177](),[4.177][4.0:25](),[4.25][4.75:89](),[4.89][4.25:78](),[4.25][4.25:78](),[4.78][4.258:288](),[4.258][4.258:288](),[4.288][4.90:126](),[4.126][4.0:439](),[4.343][4.323:381](),[4.439][4.323:381](),[4.323][4.323:381](),[4.381][4.79:137](),[4.137][4.0:139](),[4.139][4.138:177](),[4.572][4.138:177](),[4.177][4.948:1201](),[4.958][4.948:1201](),[4.1201][4.2030:2186](),[4.157][4.265:389](),[4.2186][4.265:389](),[4.265][4.265:389](),[4.122][4.1323:1333](),[4.389][4.1323:1333](),[4.1323][4.1323:1333](),[4.1333][4.178:212](),[4.212][4.344:345](),[4.345][4.2187:2203](),[4.362][4.232:259](),[4.2203][4.232:259](),[4.232][4.232:259](),[4.399][4.399:483](),[4.483][4.440:511](),[4.511][4.549:627](),[4.549][4.549:627](),[4.627][4.368:433](),[4.368][4.368:433](),[4.433][4.628:685](),[4.433][4.1465:1471](),[4.685][4.1465:1471](),[4.1465][4.1465:1471](),[4.1471][4.2204:2205](),[4.2205][4.686:713](),[4.1476][4.686:713]()
    }
    sub getEvals {
    my ($self, $c, $offset, $rows) = @_;
    my @evals = $c->stash->{jobset}->jobsetevals->search(
    { hasnewbuilds => 1 },
    { order_by => "id DESC", rows => $rows + 1, offset => $offset });
    my @res = ();
    my $prevInputs = [];
    my $prev;
    for (my $n = scalar @evals - 1; $n >= 0; $n--) {
    my $cur = $evals[$n];
    # Get stats for this eval.
    my $nrScheduled;
    my $nrSucceeded = $cur->nrsucceeded;
    if (defined $nrSucceeded) {
    $nrScheduled = 0;
    } else {
    $nrScheduled = $cur->builds->search({finished => 0})->count;
    $nrSucceeded = $cur->builds->search({finished => 1, buildStatus => 0})->count;
    if ($nrScheduled == 0) {
    $cur->update({nrsucceeded => $nrSucceeded});
    }
    }
    # Compute what inputs changed between each eval.
    my $curInputs = [ $cur->jobsetevalinputs->search(
    { -or => [ -and => [ uri => { '!=' => undef }, revision => { '!=' => undef }], dependency => { '!=' => undef }], altNr => 0 },
    { order_by => "name" }) ];
    my @changedInputs;
    my %prevInputsHash;
    $prevInputsHash{$_->name} = $_ foreach @{$prevInputs};
    foreach my $input (@{$curInputs}) {
    my $p = $prevInputsHash{$input->name};
    push @changedInputs, $input
    if !defined $p || ($input->revision || "") ne ($p->revision || "") || $input->type ne $p->type || ($input->uri || "") ne ($p->uri || "") ||
    ( defined $input->dependency && defined $p->dependency && $input->dependency->id ne $p->dependency->id);
    }
    $prevInputs = $curInputs;
    my $e =
    { eval => $cur
    , nrScheduled => $nrScheduled
    , nrSucceeded => $nrSucceeded
    , nrFailed => $cur->nrbuilds - $nrSucceeded - $nrScheduled
    , diff => defined $prev ? $nrSucceeded - $prev->{nrSucceeded} : 0
    , changedInputs => [ @changedInputs ]
    };
    push @res, $e if $n < $rows;
    $prev = $e;
    }
    return [reverse @res];
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 309
    [4.123][4.123:170]()
    $c->stash->{template} = 'jobset-evals.tt';
    [4.123]
    [4.1562]
    $c->stash->{template} = 'evals.tt';
  • edit in src/lib/Hydra/Controller/Jobset.pm at line 314
    [4.257]
    [4.1564]
    my $evals = $c->stash->{jobset}->jobsetevals;
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 319
    [4.340][4.340:436](),[4.436][4.1496:1589]()
    $c->stash->{total} = $c->stash->{jobset}->jobsetevals->search({hasnewbuilds => 1})->count;
    $c->stash->{evals} = getEvals($self, $c, ($page - 1) * $resultsPerPage, $resultsPerPage)
    [4.340]
    [4.1296]
    $c->stash->{total} = $evals->search({hasnewbuilds => 1})->count;
    $c->stash->{evals} = getEvals($self, $c, $evals, ($page - 1) * $resultsPerPage, $resultsPerPage)
  • edit in src/lib/Hydra/Controller/Root.pm at line 281
    [63.416]
    [63.416]
    }
    sub evals :Local Args(0) {
    my ($self, $c) = @_;
    $c->stash->{template} = 'evals.tt';
    my $page = int($c->req->param('page') || "1") || 1;
    my $resultsPerPage = 20;
    my $evals = $c->model('DB::JobsetEvals');
    $c->stash->{page} = $page;
    $c->stash->{resultsPerPage} = $resultsPerPage;
    $c->stash->{total} = $evals->search({hasnewbuilds => 1})->count;
    $c->stash->{evals} = getEvals($self, $c, $evals, ($page - 1) * $resultsPerPage, $resultsPerPage)
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 18
    [4.9497][4.9497:9517]()
    getMainOutput);
    [4.9497]
    [4.77]
    getMainOutput
    getEvals);
  • edit in src/lib/Hydra/Helper/Nix.pm at line 288
    [4.9702]
    [4.9702]
    }
    sub getEvals {
    my ($self, $c, $evals, $offset, $rows) = @_;
    my @evals = $evals->search(
    { hasnewbuilds => 1 },
    { order_by => "id DESC", rows => $rows + 1, offset => $offset });
    my @res = ();
    my $prevInputs = [];
    my $prev;
    for (my $n = scalar @evals - 1; $n >= 0; $n--) {
    my $cur = $evals[$n];
    # Get stats for this eval.
    my $nrScheduled;
    my $nrSucceeded = $cur->nrsucceeded;
    if (defined $nrSucceeded) {
    $nrScheduled = 0;
    } else {
    $nrScheduled = $cur->builds->search({finished => 0})->count;
    $nrSucceeded = $cur->builds->search({finished => 1, buildStatus => 0})->count;
    if ($nrScheduled == 0) {
    $cur->update({nrsucceeded => $nrSucceeded});
    }
    }
    # Compute what inputs changed between each eval.
    my $curInputs = [ $cur->jobsetevalinputs->search(
    { -or => [ -and => [ uri => { '!=' => undef }, revision => { '!=' => undef }], dependency => { '!=' => undef }], altNr => 0 },
    { order_by => "name" }) ];
    my @changedInputs;
    my %prevInputsHash;
    $prevInputsHash{$_->name} = $_ foreach @{$prevInputs};
    foreach my $input (@{$curInputs}) {
    my $p = $prevInputsHash{$input->name};
    push @changedInputs, $input
    if !defined $p || ($input->revision || "") ne ($p->revision || "") || $input->type ne $p->type || ($input->uri || "") ne ($p->uri || "") ||
    ( defined $input->dependency && defined $p->dependency && $input->dependency->id ne $p->dependency->id);
    }
    $prevInputs = $curInputs;
    my $e =
    { eval => $cur
    , nrScheduled => $nrScheduled
    , nrSucceeded => $nrSucceeded
    , nrFailed => $cur->nrbuilds - $nrSucceeded - $nrScheduled
    , diff => defined $prev ? $nrSucceeded - $prev->{nrSucceeded} : 0
    , changedInputs => [ @changedInputs ]
    };
    push @res, $e if $n < $rows;
    $prev = $e;
    }
    return [reverse @res];
  • edit in src/root/common.tt at line 387
    [4.9786]
    [4.9786]
    [% IF !jobset %]
    <th>Jobset</th>
    [% END %]
  • replacement in src/root/common.tt at line 391
    [4.9805][4.9805:9827]()
    <th>Date</th>
    [4.9805]
    [4.9827]
    <th style="width: 10em">Date</th>
  • replacement in src/root/common.tt at line 393
    [4.9858][4.9858:9895]()
    <th colspan='2'>Success</th>
    [4.9858]
    [4.9895]
    <th colspan='2' style="width: 25em">Success</th>
  • edit in src/root/common.tt at line 401
    [4.10056]
    [4.277]
    [% IF !jobset %]
    <td>[% INCLUDE renderFullJobsetName project=eval.get_column('project') jobset=eval.get_column('jobset') %]</td>
    [% END %]
  • replacement in src/root/common.tt at line 411
    [4.10420][4.10420:10445]()
    sep=',';
    [4.10420]
    [4.10445]
    sep=', ';
  • edit in src/root/error.tt at line 3
    [4.1258][4.8554:8555](),[4.7190][4.8554:8555](),[4.8554][4.8554:8555](),[4.8555][4.11465:11525]()
    <p>I'm very sorry, but the following error(s) occurred:</p>
  • edit in src/root/error.tt at line 4
    [4.11526][4.11526:11531]()
    <ul>
  • replacement in src/root/error.tt at line 5
    [4.11561][4.11561:11624]()
    <li><div class="error-msg">[% HTML.escape(error) %]</div></li>
    [4.11561]
    [4.11624]
    <div class="alert alert-error">[% HTML.escape(error) %]</div>
  • edit in src/root/error.tt at line 7
    [4.11634][4.11634:11640]()
    </ul>
  • file move: jobset-evals.tt (----------)evals.tt (----------)
    [4.1486]
    [4.6334]
  • replacement in src/root/evals.tt at line 1
    [4.6334][4.2155:2236]()
    [% WRAPPER layout.tt title="Evaluations of jobset $project.name:$jobset.name" %]
    [4.6334]
    [4.6419]
    [% WRAPPER layout.tt title=(jobset ? "Evaluations of jobset $project.name:$jobset.name" : "Latest evaluations") %]
  • edit in src/root/topbar.tt at line 40
    [2.480]
    [2.480]
    uri = c.uri_for(c.controller('Root').action_for('evals'))
    title = "Latest evaluations" %]
    [% INCLUDE makeLink