Replace $NIX_REMOTE_SYSTEMS with an option "builder-files"

Also, to unify with hydra-queue-runner, allow it to be a list of
files.
This commit is contained in:
Eelco Dolstra 2017-05-02 14:36:59 +02:00
parent cd4d2705ec
commit 7f6837a0f6
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
4 changed files with 34 additions and 14 deletions

View file

@ -43,6 +43,10 @@ Settings::Settings()
lockCPU = getEnv("NIX_AFFINITY_HACK", "1") == "1"; lockCPU = getEnv("NIX_AFFINITY_HACK", "1") == "1";
caFile = getEnv("NIX_SSL_CERT_FILE", getEnv("SSL_CERT_FILE", "/etc/ssl/certs/ca-certificates.crt")); caFile = getEnv("NIX_SSL_CERT_FILE", getEnv("SSL_CERT_FILE", "/etc/ssl/certs/ca-certificates.crt"));
/* Backwards compatibility. */
auto s = getEnv("NIX_REMOTE_SYSTEMS");
if (s != "") builderFiles = tokenizeString<Strings>(s, ":");
#if __linux__ #if __linux__
sandboxPaths = tokenizeString<StringSet>("/bin/sh=" BASH_PATH); sandboxPaths = tokenizeString<StringSet>("/bin/sh=" BASH_PATH);
#endif #endif

View file

@ -133,6 +133,10 @@ public:
Setting<std::string> builders{this, "", "builders", Setting<std::string> builders{this, "", "builders",
"A semicolon-separated list of build machines, in the format of nix.machines."}; "A semicolon-separated list of build machines, in the format of nix.machines."};
Setting<Strings> builderFiles{this,
{nixConfDir + "/machines"}, "builder-files",
"A list of files specifying build machines."};
Setting<off_t> reservedSize{this, 8 * 1024 * 1024, "gc-reserved-space", Setting<off_t> reservedSize{this, 8 * 1024 * 1024, "gc-reserved-space",
"Amount of reserved disk space for the garbage collector."}; "Amount of reserved disk space for the garbage collector."};

View file

@ -12,7 +12,8 @@ Machine::Machine(decltype(storeUri) storeUri,
decltype(maxJobs) maxJobs, decltype(maxJobs) maxJobs,
decltype(speedFactor) speedFactor, decltype(speedFactor) speedFactor,
decltype(supportedFeatures) supportedFeatures, decltype(supportedFeatures) supportedFeatures,
decltype(mandatoryFeatures) mandatoryFeatures) : decltype(mandatoryFeatures) mandatoryFeatures,
decltype(sshPublicHostKey) sshPublicHostKey) :
storeUri( storeUri(
// Backwards compatibility: if the URI is a hostname, // Backwards compatibility: if the URI is a hostname,
// prepend ssh://. // prepend ssh://.
@ -24,7 +25,8 @@ Machine::Machine(decltype(storeUri) storeUri,
maxJobs(maxJobs), maxJobs(maxJobs),
speedFactor(std::max(1U, speedFactor)), speedFactor(std::max(1U, speedFactor)),
supportedFeatures(supportedFeatures), supportedFeatures(supportedFeatures),
mandatoryFeatures(mandatoryFeatures) mandatoryFeatures(mandatoryFeatures),
sshPublicHostKey(sshPublicHostKey)
{} {}
bool Machine::allSupported(const std::set<string> & features) const { bool Machine::allSupported(const std::set<string> & features) const {
@ -52,13 +54,19 @@ void parseMachines(const std::string & s, Machines & machines)
auto sz = tokens.size(); auto sz = tokens.size();
if (sz < 1) if (sz < 1)
throw FormatError("bad machine specification %s", line); throw FormatError("bad machine specification %s", line);
auto isSet = [&](int n) {
return tokens.size() > n && tokens[n] != "" && tokens[n] != "-";
};
machines.emplace_back(tokens[0], machines.emplace_back(tokens[0],
sz >= 2 ? tokenizeString<std::vector<string>>(tokens[1], ",") : std::vector<string>{settings.thisSystem}, isSet(1) ? tokenizeString<std::vector<string>>(tokens[1], ",") : std::vector<string>{settings.thisSystem},
sz >= 3 ? tokens[2] : "", isSet(2) ? tokens[2] : "",
sz >= 4 ? std::stoull(tokens[3]) : 1LL, isSet(3) ? std::stoull(tokens[3]) : 1LL,
sz >= 5 ? std::stoull(tokens[4]) : 1LL, isSet(4) ? std::stoull(tokens[4]) : 1LL,
sz >= 6 ? tokenizeString<std::set<string>>(tokens[5], ",") : std::set<string>{}, isSet(5) ? tokenizeString<std::set<string>>(tokens[5], ",") : std::set<string>{},
sz >= 7 ? tokenizeString<std::set<string>>(tokens[6], ",") : std::set<string>{}); isSet(6) ? tokenizeString<std::set<string>>(tokens[6], ",") : std::set<string>{},
isSet(7) ? tokens[7] : "");
} }
} }
@ -66,11 +74,13 @@ Machines getMachines()
{ {
Machines machines; Machines machines;
try { for (auto & file : settings.builderFiles.get()) {
parseMachines(readFile(getEnv("NIX_REMOTE_SYSTEMS", settings.nixConfDir + "/machines")), machines); try {
} catch (const SysError & e) { parseMachines(readFile(file), machines);
if (e.errNo != ENOENT) } catch (const SysError & e) {
throw; if (e.errNo != ENOENT)
throw;
}
} }
parseMachines(settings.builders, machines); parseMachines(settings.builders, machines);

View file

@ -13,6 +13,7 @@ struct Machine {
const unsigned int speedFactor; const unsigned int speedFactor;
const std::set<string> supportedFeatures; const std::set<string> supportedFeatures;
const std::set<string> mandatoryFeatures; const std::set<string> mandatoryFeatures;
const std::string sshPublicHostKey;
bool enabled = true; bool enabled = true;
bool allSupported(const std::set<string> & features) const; bool allSupported(const std::set<string> & features) const;
@ -25,7 +26,8 @@ struct Machine {
decltype(maxJobs) maxJobs, decltype(maxJobs) maxJobs,
decltype(speedFactor) speedFactor, decltype(speedFactor) speedFactor,
decltype(supportedFeatures) supportedFeatures, decltype(supportedFeatures) supportedFeatures,
decltype(mandatoryFeatures) mandatoryFeatures); decltype(mandatoryFeatures) mandatoryFeatures,
decltype(sshPublicHostKey) sshPublicHostKey);
}; };
typedef std::vector<Machine> Machines; typedef std::vector<Machine> Machines;