diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-04-30T21·22-0400 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-04-30T21·22-0400 |
commit | 59a26360c75f1cf5fe65fce5e3703df0b6645140 (patch) | |
tree | 0335e94c4d795df78a62b63f41ca241e9698d344 | |
parent | 82ae0e688c21794bea583f9b48bb3639f7e2601a (diff) |
Support mandatory system features in the build hook
Mandatory features are features that MUST be present in a derivation's requiredSystemFeatures attribute. One application is performance testing, where we have a dedicated machine to run performance tests (and nothing else). Then we would add the label "perf" to the machine's mandatory features and to the performance testing derivations.
-rw-r--r-- | doc/manual/build-farm.xml | 17 | ||||
-rwxr-xr-x | scripts/build-remote.pl.in | 12 |
2 files changed, 22 insertions, 7 deletions
diff --git a/doc/manual/build-farm.xml b/doc/manual/build-farm.xml index f2d4a477e6b9..2e0d86b89f09 100644 --- a/doc/manual/build-farm.xml +++ b/doc/manual/build-farm.xml @@ -31,6 +31,7 @@ variable</link>.</para> nix@mcflurry.labs.cs.uu.nl powerpc-darwin /home/nix/.ssh/id_quarterpounder_auto 2 nix@scratchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 1 kvm nix@itchy.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 2 +nix@poochie.labs.cs.uu.nl i686-linux /home/nix/.ssh/id_scratchy_auto 8 2 kvm perf </programlisting> </example> @@ -73,11 +74,12 @@ bits of information: the machine. If there are multiple machines of the right type, Nix will prefer the fastest, taking load into account.</para></listitem> - <listitem><para>A comma-separated list of - <emphasis>features</emphasis>. If a derivation has the + <listitem><para>A comma-separated list of <emphasis>supported + features</emphasis>. If a derivation has the <varname>requiredSystemFeatures</varname> attribute, then <filename>build-remote.pl</filename> will only perform the - derivation on a machine that has the specified features. For instance, the attribute + derivation on a machine that has the specified features. For + instance, the attribute <programlisting> requiredSystemFeatures = [ "kvm" ]; @@ -87,6 +89,15 @@ requiredSystemFeatures = [ "kvm" ]; <literal>kvm</literal> feature (i.e., <literal>scratchy</literal> in the example above).</para></listitem> + <listitem><para>A comma-separated list of <emphasis>mandatory + features</emphasis>. A machine will only be used to build a + derivation if all of the machine’s mandatory features appear in the + derivation’s <varname>requiredSystemFeatures</varname> attribute. + Thus, in the example, the machine <literal>poochie</literal> will + only do derivations that have + <varname>requiredSystemFeatures</varname> set to <literal>["kvm" + "perf"]</literal> or <literal>["perf"]</literal>.</para></listitem> + </orderedlist> You should also set up the environment variable diff --git a/scripts/build-remote.pl.in b/scripts/build-remote.pl.in index da5561cd2199..e54386d424fa 100755 --- a/scripts/build-remote.pl.in +++ b/scripts/build-remote.pl.in @@ -70,13 +70,16 @@ if (defined $conf && -e $conf) { s/\#.*$//g; next if /^\s*$/; my @tokens = split /\s/, $_; + my @supportedFeatures = split(/,/, $tokens[5] || ""); + my @mandatoryFeatures = split(/,/, $tokens[6] || ""); push @machines, { hostName => $tokens[0] , systemTypes => [ split(/,/, $tokens[1]) ] , sshKeys => $tokens[2] , maxJobs => int($tokens[3]) , speedFactor => 1.0 * (defined $tokens[4] ? int($tokens[4]) : 1) - , features => [ split(/,/, $tokens[5] || "") ] + , supportedFeatures => [ @supportedFeatures, @mandatoryFeatures ] + , mandatoryFeatures => [ @mandatoryFeatures ] , enabled => 1 }; } @@ -90,8 +93,7 @@ my ($drvPath, $hostName, $slotLock); REQ: while (1) { $_ = <STDIN> || exit 0; - my ($amWilling, $neededSystem); - ($amWilling, $neededSystem, $drvPath, $requiredFeatures) = split; + (my $amWilling, my $neededSystem, $drvPath, my $requiredFeatures) = split; my @requiredFeatures = split /,/, $requiredFeatures; my $canBuildLocally = $amWilling && ($localSystem eq $neededSystem); @@ -117,7 +119,9 @@ REQ: while (1) { LOOP: foreach my $cur (@machines) { if ($cur->{enabled} && (grep { $neededSystem eq $_ } @{$cur->{systemTypes}}) - && all(map { my $f = $_; 0 != grep { $f eq $_ } @{$cur->{features}} } @requiredFeatures)) + && all(map { my $f = $_; 0 != grep { $f eq $_ } @{$cur->{supportedFeatures}} } (@requiredFeatures, @mandatoryFeatures)) + && all(map { my $f = $_; 0 != grep { $f eq $_ } @requiredFeatures } @{$cur->{mandatoryFeatures}}) + ) { $rightType = 1; |