add api endpoint: /build/<id>/constituents

Returns a list of constituent builds
This commit is contained in:
Graham Christensen 2021-09-24 15:52:46 -04:00
parent 99161c7c53
commit c60c8d10ea
4 changed files with 111 additions and 0 deletions

View file

@ -504,6 +504,32 @@ paths:
schema:
$ref: '#/components/schemas/Error'
/build/{build-id}/constituents:
get:
summary: Retrieves a build's constituent jobs
parameters:
- name: build-id
in: path
description: build identifier
required: true
schema:
type: integer
responses:
'200':
description: build
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Build'
'404':
description: build couldn't be found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/eval/{build-id}:
get:
summary: Retrieves evaluations identified by build id

View file

@ -104,6 +104,19 @@ sub build_GET {
$c->stash->{binaryCachePublicUri} = $c->config->{binary_cache_public_uri};
}
sub constituents :Chained('buildChain') :PathPart('constituents') :Args(0) :ActionClass('REST') { }
sub constituents_GET {
my ($self, $c) = @_;
my $build = $c->stash->{build};
$self->status_ok(
$c,
entity => [$build->constituents_->search({}, {order_by => ["job"]})]
);
}
sub view_nixlog : Chained('buildChain') PathPart('nixlog') {
my ($self, $c, $stepnr, $mode) = @_;

View file

@ -0,0 +1,46 @@
use strict;
use Setup;
use JSON qw(decode_json encode_json);
use Data::Dumper;
use URI;
my %ctx = test_init();
require Hydra::Schema;
require Hydra::Model::DB;
require Hydra::Helper::Nix;
use Test2::V0;
require Catalyst::Test;
Catalyst::Test->import('Hydra');
use HTTP::Request::Common;
my $db = Hydra::Model::DB->new;
hydra_setup($db);
my $project = $db->resultset('Projects')->create({name => "tests", displayname => "", owner => "root"});
my $jobset = createBaseJobset("aggregate", "aggregate.nix", $ctx{jobsdir});
ok(evalSucceeds($jobset), "Evaluating jobs/aggregate.nix should exit with return code 0");
is(nrQueuedBuildsForJobset($jobset), 3, "Evaluating jobs/aggregate.nix should result in 3 builds");
for my $build (queuedBuildsForJobset($jobset)) {
ok(runBuild($build), "Build '".$build->job."' from jobs/aggregate.nix should exit with return code 0");
}
my $build_redirect = request(GET '/job/tests/aggregate/aggregate/latest-finished');
my $url = URI->new($build_redirect->header('location'))->path . "/constituents";
my $constituents = request(GET $url,
Accept => 'application/json',
);
ok($constituents->is_success, "Getting the constituent builds");
my $data = decode_json($constituents->content);
my ($buildA) = grep { $_->{nixname} eq "empty-dir-a" } @$data;
my ($buildB) = grep { $_->{nixname} eq "empty-dir-b" } @$data;
is($buildA->{job}, "a");
is($buildB->{job}, "b");
done_testing;

26
t/jobs/aggregate.nix Normal file
View file

@ -0,0 +1,26 @@
with import ./config.nix;
{
a =
mkDerivation {
name = "empty-dir-a";
builder = ./empty-dir-builder.sh;
};
b =
mkDerivation {
name = "empty-dir-b";
builder = ./empty-dir-builder.sh;
};
aggregate =
mkDerivation {
name = "aggregate";
builder = ./empty-dir-builder.sh; # doesn't matter, just needs to pass a build
_hydraAggregate = true;
constituents = [
"a"
"b"
];
};
}