added some json responses

[?]
Sep 2, 2010, 12:21 PM
BKOIYITRBRVU4D7XFAZPV5QHAPCBMIO3SBNHYJ6TVT43WR32CTHQC

Dependencies

  • [2] DO432JDJ * Build Hydra with the Nix Perl bindings.
  • [3] QTFVCDIF added hide feature for project/jobset
  • [4] P5X4P6VK * Renaming "release sets" to "views" (not finished yet). Having
  • [5] PC6UOHH7 add some stats to jobsets in project view
  • [6] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [7] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [8] 5QE3TIHP hydra: add status icon per jobset on project page
  • [*] SAFVRDTK * Put Hydra's dependencies so that they can easily be installed in a
  • [*] YFPZ46YK * hydra: added variant of build input type, 'build output (same system)' to allow better continous integration in one jobset for multiple system. it makes sure that the system of the build that is passed as input for a job has the same system as the job.
  • [*] D5QIOJGP * Move everything up one directory.

Change contents

  • edit in deps.nix at line 38
    [11.49]
    [2.327]
    perlPackages.JSONXS
  • file addition: API.pm (----------)
    [12.188]
    package Hydra::Controller::API;
    use strict;
    use warnings;
    use base 'Catalyst::Controller';
    use Hydra::Helper::Nix;
    use Hydra::Helper::CatalystUtils;
    use Hydra::Controller::Project;
    use JSON::Any;
    use DateTime;
    sub api : Chained('/') PathPart('api') CaptureArgs(0) {
    my ($self, $c) = @_;
    $c->response->content_type('application/json');
    }
    sub projectToHash {
    my ($project) = @_;
    return {
    name => $project->name,
    description => $project->description
    };
    }
    sub projects : Chained('api') PathPart('projects') Args(0) {
    my ($self, $c) = @_;
    my @projects = $c->model('DB::Projects')->search({hidden => 0}, {order_by => 'name'}) ;
    my @list ;
    foreach my $p (@projects) {
    push @list, projectToHash($p) ;
    }
    $c->stash->{'plain'} = {
    data => scalar (JSON::Any->objToJson(\@list))
    };
    $c->forward('Hydra::View::Plain');
    }
    sub buildToHash {
    my ($build) = @_;
    my $result = {
    id => $build->id,
    project => $build->get_column("project"),
    jobset => $build->get_column("jobset"),
    job => $build->get_column("job"),
    system => $build->system,
    nixname => $build->nixname,
    finished => $build->finished,
    timestamp => $build->timestamp
    };
    if($build->finished) {
    $result->{'buildstatus'} = $build->get_column("buildstatus") ;
    } else {
    $result->{'busy'} = $build->get_column("busy");
    $result->{'priority'} = $build->get_column("priority");
    }
    return $result;
    };
    sub latestbuilds : Chained('api') PathPart('latestbuilds') Args(0) {
    my ($self, $c) = @_;
    my $nr = $c->request->params->{nr} ;
    error($c, "Parameter not defined!") if !defined $nr;
    my $project = $c->request->params->{project} ;
    my $jobset = $c->request->params->{jobset} ;
    my $job = $c->request->params->{job} ;
    my $system = $c->request->params->{system} ;
    my $filter = {finished => 1} ;
    $filter->{project} = $project if ! $project eq "";
    $filter->{jobset} = $jobset if ! $jobset eq "";
    $filter->{job} = $job if !$job eq "";
    $filter->{system} = $system if !$system eq "";
    my @latest = joinWithResultInfo($c, $c->model('DB::Builds'))->search($filter, {rows => $nr, order_by => ["timestamp DESC"] });
    my @list ;
    foreach my $b (@latest) {
    push @list, buildToHash($b) ;
    }
    $c->stash->{'plain'} = {
    data => scalar (JSON::Any->objToJson(\@list))
    };
    $c->forward('Hydra::View::Plain');
    }
    sub jobsetToHash {
    my ($jobset) = @_;
    return {
    project => $jobset->project->name,
    name => $jobset->name,
    nrscheduled => $jobset->get_column("nrscheduled"),
    nrsucceeded => $jobset->get_column("nrsucceeded"),
    nrfailed => $jobset->get_column("nrfailed"),
    nrtotal => $jobset->get_column("nrtotal")
    };
    }
    sub jobsets : Chained('api') PathPart('jobsets') Args(0) {
    my ($self, $c) = @_;
    my $projectName = $c->request->params->{project} ;
    error($c, "Parameter 'project' not defined!") if !defined $projectName;
    my $project = $c->model('DB::Projects')->find($projectName)
    or notFound($c, "Project $projectName doesn't exist.");
    my @jobsets = jobsetOverview($c, $project);
    my @list ;
    foreach my $j (@jobsets) {
    push @list, jobsetToHash($j) ;
    }
    $c->stash->{'plain'} = {
    data => scalar (JSON::Any->objToJson(\@list))
    };
    $c->forward('Hydra::View::Plain');
    }
    sub queue : Chained('api') PathPart('queue') Args(0) {
    my ($self, $c) = @_;
    my $nr = $c->request->params->{nr} ;
    error($c, "Parameter not defined!") if !defined $nr;
    my @builds = $c->model('DB::Builds')->search({finished => 0}, {rows => $nr, join => ['schedulingInfo'] , order_by => ["busy DESC", "priority DESC", "timestamp"], '+select' => ['schedulingInfo.priority', 'schedulingInfo.busy'], '+as' => ['priority', 'busy'] });
    my @list ;
    foreach my $b (@builds) {
    push @list, buildToHash($b) ;
    }
    $c->stash->{'plain'} = {
    data => scalar (JSON::Any->objToJson(\@list))
    };
    $c->forward('Hydra::View::Plain');
    }
    sub nrqueue : Chained('api') PathPart('nrqueue') Args(0) {
    my ($self, $c) = @_;
    my $nrQueuedBuilds = $c->model('DB::BuildSchedulingInfo')->count();
    $c->stash->{'plain'} = {
    data => $nrQueuedBuilds
    };
    $c->forward('Hydra::View::Plain');
    }
    sub nrrunning : Chained('api') PathPart('nrrunning') Args(0) {
    my ($self, $c) = @_;
    my $nrRunningBuilds = $c->model('DB::BuildSchedulingInfo')->search({ busy => 1 }, {})->count();
    $c->stash->{'plain'} = {
    data => $nrRunningBuilds
    };
    $c->forward('Hydra::View::Plain');
    }
    sub ts {
    my ($nr, $period) = @_;
    my @arr ;
    return @arr;
    }
    sub nrbuilds : Chained('api') PathPart('nrbuilds') Args(0) {
    my ($self, $c) = @_;
    my $nr = $c->request->params->{nr} ;
    my $period = $c->request->params->{period} ;
    error($c, "Parameter not defined!") if !defined $nr || !defined $period;
    my $base;
    my $project = $c->request->params->{project} ;
    my $jobset = $c->request->params->{jobset} ;
    my $job = $c->request->params->{job} ;
    my $system = $c->request->params->{system} ;
    my $filter = {finished => 1} ;
    $filter->{project} = $project if ! $project eq "";
    $filter->{jobset} = $jobset if ! $jobset eq "";
    $filter->{job} = $job if !$job eq "";
    $filter->{system} = $system if !$system eq "";
    $base = 60*60 if($period eq "hour");
    $base = 24*60*60 if($period eq "day");
    my @stats = $c->model('DB::Builds')->search($filter, {select => ["count(*)"], as => ["nr"], group_by => ["timestamp - timestamp % $base"], order_by => "timestamp - timestamp % $base DESC", rows => $nr}) ;
    my @arr ;
    foreach my $d (@stats) {
    push @arr, int($d->get_column("nr"));
    }
    @arr = reverse(@arr);
    $c->stash->{'plain'} = {
    data => scalar (JSON::Any->objToJson(\@arr))
    };
    $c->forward('Hydra::View::Plain');
    }
    1;
  • edit in src/lib/Hydra/Controller/Project.pm at line 9
    [4.1457]
    [4.1457]
    our @ISA = qw(Exporter);
    our @EXPORT = qw(jobsetOverview);
  • edit in src/lib/Hydra/Controller/Project.pm at line 22
    [4.1756]
    [4.1756]
    sub jobsetOverview {
    my ($c, $project) = @_;
    return $project->jobsets->search( isProjectOwner($c, $project->name) ? {} : { hidden => 0 },
    { order_by => "name"
    , "+select" => [
    "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildSchedulingInfo WHERE me.project = a.project AND me.name = a.jobset AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildResultInfo WHERE me.project = a.project AND me.name = a.jobset AND buildstatus <> 0 AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildResultInfo WHERE me.project = a.project AND me.name = a.jobset AND buildstatus = 0 AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a WHERE me.project = a.project AND me.name = a.jobset AND a.isCurrent = 1 )"
    ]
    , "+as" => ["nrscheduled", "nrfailed", "nrsucceeded", "nrtotal"]
    });
    }
  • replacement in src/lib/Hydra/Controller/Project.pm at line 44
    [4.402][3.745:883](),[3.883][4.77:617](),[4.77][4.77:617](),[4.617][4.0:119](),[4.119][4.617:626](),[4.617][4.617:626](),[4.626][4.120:201](),[4.201][4.696:707](),[4.696][4.696:707]()
    $c->stash->{jobsets} = [$c->stash->{project}->jobsets->search( isProjectOwner($c, $c->stash->{project}->name) ? {} : { hidden => 0 },
    { order_by => "name"
    , "+select" => [
    "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildSchedulingInfo WHERE me.project = a.project AND me.name = a.jobset AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildResultInfo WHERE me.project = a.project AND me.name = a.jobset AND buildstatus <> 0 AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a NATURAL JOIN BuildResultInfo WHERE me.project = a.project AND me.name = a.jobset AND buildstatus = 0 AND a.isCurrent = 1 )"
    , "(SELECT COUNT(*) FROM Builds AS a WHERE me.project = a.project AND me.name = a.jobset AND a.isCurrent = 1 )"
    ]
    , "+as" => ["nrscheduled", "nrfailed", "nrsucceeded", "nrtotal"]
    })];
    [4.402]
    [4.1942]
    $c->stash->{jobsets} = [jobsetOverview($c, $c->stash->{project})];