This commit is contained in:
Eelco Dolstra 2021-10-29 14:45:13 +02:00
parent 6e30d9b69f
commit e6795c4350

View file

@ -39,7 +39,8 @@ Machine::Machine(decltype(storeUri) storeUri,
sshPublicHostKey(sshPublicHostKey) sshPublicHostKey(sshPublicHostKey)
{} {}
bool Machine::allSupported(const std::set<string> & features) const { bool Machine::allSupported(const std::set<string> & features) const
{
return std::all_of(features.begin(), features.end(), return std::all_of(features.begin(), features.end(),
[&](const string & feature) { [&](const string & feature) {
return supportedFeatures.count(feature) || return supportedFeatures.count(feature) ||
@ -47,14 +48,16 @@ bool Machine::allSupported(const std::set<string> & features) const {
}); });
} }
bool Machine::mandatoryMet(const std::set<string> & features) const { bool Machine::mandatoryMet(const std::set<string> & features) const
{
return std::all_of(mandatoryFeatures.begin(), mandatoryFeatures.end(), return std::all_of(mandatoryFeatures.begin(), mandatoryFeatures.end(),
[&](const string & feature) { [&](const string & feature) {
return features.count(feature); return features.count(feature);
}); });
} }
ref<Store> Machine::openStore() const { ref<Store> Machine::openStore() const
{
Store::Params storeParams; Store::Params storeParams;
if (hasPrefix(storeUri, "ssh://")) { if (hasPrefix(storeUri, "ssh://")) {
storeParams["max-connections"] = "1"; storeParams["max-connections"] = "1";
@ -83,7 +86,8 @@ ref<Store> Machine::openStore() const {
return nix::openStore(storeUri, storeParams); return nix::openStore(storeUri, storeParams);
} }
static std::vector<std::string> expandBuilderLines(const std::string& builders) { static std::vector<std::string> expandBuilderLines(const std::string & builders)
{
std::vector<std::string> result; std::vector<std::string> result;
for (auto line : tokenizeString<std::vector<string>>(builders, "\n;")) { for (auto line : tokenizeString<std::vector<string>>(builders, "\n;")) {
trim(line); trim(line);
@ -111,7 +115,8 @@ static std::vector<std::string> expandBuilderLines(const std::string& builders)
return result; return result;
} }
static Machine parseBuilderLine(const std::string& line) { static Machine parseBuilderLine(const std::string & line)
{
const auto tokens = tokenizeString<std::vector<string>>(line); const auto tokens = tokenizeString<std::vector<string>>(line);
auto isSet = [&](size_t fieldIndex) { auto isSet = [&](size_t fieldIndex) {
@ -127,27 +132,28 @@ static Machine parseBuilderLine(const std::string& line) {
}; };
auto ensureBase64 = [&](size_t fieldIndex) { auto ensureBase64 = [&](size_t fieldIndex) {
const auto& str = tokens[fieldIndex]; const auto & str = tokens[fieldIndex];
try { try {
base64Decode(str); base64Decode(str);
} catch (const Error& e) { } catch (const Error & e) {
throw FormatError("bad machine specification: a column #%lu in a row: '%s' is not valid base64 string: %s", fieldIndex, line, e.what()); throw FormatError("bad machine specification: a column #%lu in a row: '%s' is not valid base64 string: %s", fieldIndex, line, e.what());
} }
return str; return str;
}; };
if (!isSet(0)) { if (!isSet(0))
throw FormatError("bad machine specification: store URI was not found at the first column of a row: '%s'", line); throw FormatError("bad machine specification: store URL was not found at the first column of a row: '%s'", line);
}
return {tokens[0], return {
isSet(1) ? tokenizeString<std::vector<string>>(tokens[1], ",") : std::vector<string>{settings.thisSystem}, tokens[0],
isSet(2) ? tokens[2] : "", isSet(1) ? tokenizeString<std::vector<string>>(tokens[1], ",") : std::vector<string>{settings.thisSystem},
isSet(3) ? parseUnsignedIntField(3) : 1U, isSet(2) ? tokens[2] : "",
isSet(4) ? parseUnsignedIntField(4) : 1U, isSet(3) ? parseUnsignedIntField(3) : 1U,
isSet(5) ? tokenizeString<std::set<string>>(tokens[5], ",") : std::set<string>{}, isSet(4) ? parseUnsignedIntField(4) : 1U,
isSet(6) ? tokenizeString<std::set<string>>(tokens[6], ",") : std::set<string>{}, isSet(5) ? tokenizeString<std::set<string>>(tokens[5], ",") : std::set<string>{},
isSet(7) ? ensureBase64(7) : ""}; isSet(6) ? tokenizeString<std::set<string>>(tokens[6], ",") : std::set<string>{},
isSet(7) ? ensureBase64(7) : ""
};
} }
static Machines parseBuilderLines(const std::vector<std::string>& builders) { static Machines parseBuilderLines(const std::vector<std::string>& builders) {