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

[?]
Sep 24, 2021, 7:52 PM
TRPMSYL3DKHQIL2ZZTZYGRMPPVDBH6X7OM4JYTPL77AEKIM5RMHAC

Dependencies

  • [2] LX326CB7 Add hydra OpenAPI description (#750)
  • [3] LQDK2TS5 Test that each page listing evals works
  • [*] LBNVQXUB * Build the /build stuff in a separate controller.
  • [*] LZVO64YG Merge in the first bits of the API work
  • [*] 2JJP7673 tests: move to t, allow `yath test` from root

Change contents

  • edit in hydra-api.yaml at line 500
    [2.12571]
    [2.12571]
    '404':
    description: build couldn't be found
    content:
    application/json:
    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'
  • edit in src/lib/Hydra/Controller/Build.pm at line 106
    [5.1113]
    [5.1113]
    sub constituents :Chained('buildChain') :PathPart('constituents') :Args(0) :ActionClass('REST') { }
  • edit in src/lib/Hydra/Controller/Build.pm at line 109
    [5.1114]
    [5.1114]
    sub constituents_GET {
    my ($self, $c) = @_;
  • edit in src/lib/Hydra/Controller/Build.pm at line 112
    [5.1115]
    [6.4725]
    my $build = $c->stash->{build};
    $self->status_ok(
    $c,
    entity => [$build->constituents_->search({}, {order_by => ["job"]})]
    );
    }
  • file addition: constituents.t (----------)
    [3.1]
    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;
  • file addition: aggregate.nix (----------)
    [7.1263]
    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"
    ];
    };
    }