hydra-api: flesh out Jobset schema

* made all columns available via the API (except for forceeval)
* renamed flakeref to flake to unify the API with the database schema
* renamed inputs to jobsetinputs to unify the API with the database schema
This commit is contained in:
Cole Helbling 2021-04-27 15:51:17 -07:00
parent 0c8d016a38
commit 2600810551
No known key found for this signature in database
GPG key ID: B37E0F2371016A4C
4 changed files with 95 additions and 55 deletions

View file

@ -306,35 +306,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
type: object $ref: '#/components/schemas/Jobset'
properties:
'description':
description: a description of the jobset
type: string
checkinterval:
description: interval (in seconds) in which to check for evaluation
type: integer
enabled:
description: when true the jobset gets scheduled for evaluation
type: boolean
visible:
description: when true the jobset is visible in the web frontend
type: boolean
keepnr:
description: number or evaluations to keep
type: integer
nixexprinput:
description: the name of the jobset input which contains the nixexprpath
type: string
nixexprpath:
nullable: true
description: the path to the file to evaluate
type: string
inputs:
description: inputs for this jobset
type: object
additionalProperties:
$ref: '#/components/schemas/JobsetInput'
responses: responses:
'201': '201':
description: jobset creation response description: jobset creation response
@ -590,26 +562,76 @@ components:
Jobset: Jobset:
type: object type: object
properties: properties:
fetcherrormsg: name:
description: the name of the jobset
type: string
project:
description: the project this jobset belongs to
type: string
description:
nullable: true nullable: true
description: contains the error message when there was a problem fetching sources for a jobset description: a description of the jobset
type: string type: string
nixexprinput: nixexprinput:
nullable: true
description: the name of the jobset input which contains the nixexprpath description: the name of the jobset input which contains the nixexprpath
type: string type: string
errormsg:
description: contains the stderr output of the nix-instantiate command
type: string
emailoverride:
description: email address to send notices to instead of the package maintainer (can be a comma separated list)
type: string
nixexprpath: nixexprpath:
nullable: true nullable: true
description: the path to the file to evaluate description: the path to the file to evaluate
type: string type: string
errormsg:
nullable: true
description: contains the stderr output of the nix-instantiate command
type: string
errortime:
nullable: true
description: timestamp associated with errormsg
type: integer
lastcheckedtime:
nullable: true
description: the last time the evaluator looked at this jobset
type: integer
triggertime:
nullable: true
description: set to the time we were triggered by a push event
type: integer
enabled: enabled:
description: when set to true the jobset gets scheduled for evaluation description: 0 is disabled, 1 is enabled, 2 is one-shot, and 3 is one-at-a-time
type: integer
enableemail:
description: when true the jobset sends emails when previously-successful builds fail
type: boolean type: boolean
hidden:
description: when false the jobset is visible in the web frontend
type: boolean
emailoverride:
description: email address to send notices to instead of the package maintainer (can be a comma separated list)
type: string
keepnr:
description: number or evaluations to keep
type: integer
checkinterval:
description: interval (in seconds) in which to check for evaluation
type: integer
schedulingshares:
description: how many shares to be allocated to the jobset
type: integer
fetcherrormsg:
nullable: true
description: contains the error message when there was a problem fetching sources for a jobset
type: string
startime:
nullable: true
description: set to the time the latest evaluation started (if one is currently running)
type: integer
type:
description: the type of the jobset
type: string
flake:
nullable: true
description: the flake uri to evaluate
type: string
jobsetinputs: jobsetinputs:
description: inputs configured for this jobset description: inputs configured for this jobset
type: object type: object

View file

@ -231,7 +231,7 @@ sub updateJobset {
if ($type == 0) { if ($type == 0) {
($nixExprPath, $nixExprInput) = nixExprPathFromParams $c; ($nixExprPath, $nixExprInput) = nixExprPathFromParams $c;
} elsif ($type == 1) { } elsif ($type == 1) {
$flake = trim($c->stash->{params}->{"flakeref"}); $flake = trim($c->stash->{params}->{"flake"});
error($c, "Invalid flake URI $flake.") if $flake !~ /^[a-zA-Z]/; error($c, "Invalid flake URI $flake.") if $flake !~ /^[a-zA-Z]/;
} else { } else {
error($c, "Invalid jobset type."); error($c, "Invalid jobset type.");
@ -270,8 +270,8 @@ sub updateJobset {
$jobset->jobsetinputs->delete; $jobset->jobsetinputs->delete;
if ($type == 0) { if ($type == 0) {
foreach my $name (keys %{$c->stash->{params}->{inputs}}) { foreach my $name (keys %{$c->stash->{params}->{jobsetinputs}}) {
my $inputData = $c->stash->{params}->{inputs}->{$name}; my $inputData = $c->stash->{params}->{jobsetinputs}->{$name};
my $type = $inputData->{type}; my $type = $inputData->{type};
my $value = $inputData->{value}; my $value = $inputData->{value};
my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0; my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0;

View file

@ -412,12 +412,30 @@ __PACKAGE__->add_column(
my %hint = ( my %hint = (
columns => [ columns => [
"errortime",
"lastcheckedtime",
"triggertime",
"enabled", "enabled",
"errormsg", "keepnr",
"fetcherrormsg", "checkinterval",
"emailoverride", "schedulingshares",
"starttime"
],
string_columns => [
"name",
"project",
"description",
"nixexprinput",
"nixexprpath", "nixexprpath",
"nixexprinput" "errormsg",
"emailoverride",
"fetcherrormsg",
"type",
"flake"
],
boolean_columns => [
"enableemail",
"hidden"
], ],
eager_relations => { eager_relations => {
jobsetinputs => "name" jobsetinputs => "name"

View file

@ -46,8 +46,8 @@
<thead> <thead>
<tr><th></th><th>Input name</th><th>Type</th><th style="width: 50%">Value</th><th>Notify committers</th></tr> <tr><th></th><th>Input name</th><th>Type</th><th style="width: 50%">Value</th><th>Notify committers</th></tr>
</thead> </thead>
<tbody class="inputs"> <tbody class="jobsetinputs">
[% inputs = createFromEval ? eval.jobsetevalinputs : jobset.jobsetinputs; FOREACH input IN inputs %] [% jobsetinputs = createFromEval ? eval.jobsetevalinputs : jobset.jobsetinputs; FOREACH input IN jobsetinputs %]
[% INCLUDE renderJobsetInput input=input baseName="input-$input.name" %] [% INCLUDE renderJobsetInput input=input baseName="input-$input.name" %]
[% END %] [% END %]
<tr> <tr>
@ -111,9 +111,9 @@
</div> </div>
<div class="form-group row show-on-flake"> <div class="form-group row show-on-flake">
<label class="col-form-label col-sm-3" for="editjobsetflakeref">Flake URI</label> <label class="col-form-label col-sm-3" for="editjobsetflake">Flake URI</label>
<div class="col-sm-9"> <div class="col-sm-9">
<input type="text" class="form-control" id="editjobsetflakeref" name="flakeref" [% HTML.attributes(value => jobset.flake) %]/> <input type="text" class="form-control" id="editjobsetflake" name="flake" [% HTML.attributes(value => jobset.flake) %]/>
</div> </div>
</div> </div>
@ -220,8 +220,8 @@
$("#submit-jobset").click(function() { $("#submit-jobset").click(function() {
var formElements = $(this).parents("form").serializeArray(); var formElements = $(this).parents("form").serializeArray();
var data = { 'inputs': {} }; var data = { 'jobsetinputs': {} };
var inputs = {}; var jobsetinputs = {};
for (var i = 0; formElements.length > i; i++) { for (var i = 0; formElements.length > i; i++) {
var elem = formElements[i]; var elem = formElements[i];
var match = elem.name.match(/^input-([\w-]+)-(\w+)$/); var match = elem.name.match(/^input-([\w-]+)-(\w+)$/);
@ -233,13 +233,13 @@
if (baseName === "template") continue; if (baseName === "template") continue;
if (!(baseName in inputs)) if (!(baseName in jobsetinputs))
inputs[baseName] = {}; jobsetinputs[baseName] = {};
if (param === "name") if (param === "name")
data.inputs[elem.value] = inputs[baseName]; data.jobsetinputs[elem.value] = jobsetinputs[baseName];
else else
inputs[baseName][param] = elem.value; jobsetinputs[baseName][param] = elem.value;
} }
} }
redirectJSON({ redirectJSON({