feat(3p/nix/nix-daemon): Implement Worker::BuildDerivation handler

Implement the proto handler on the server side for
Worker::BuildDerivation. This includes several additions to the proto
which I had missed on the first pass, including the actual proto
definition for the Derivation itself and a few sequence number
reorderings which are fine because this is all provisional and not
deployed yet.

A couple things to note

- I implemented a couple constructors for nix classes that initialize
  themselves based on their proto variants, which felt nice and didn't
  end up causing any issues.
- I've made the conversions between the enum types in nix and in proto
  explicit via switch statements rather than using a static_cast, out of
  an abundance of caution that the error would get mismatched in the
  future and we'd convert the wrong thing to the wrong thing - this is
  verbose, but exceptionally future proof.

Change-Id: Iecf6b88e76bc37e49efa05fd65d6cd0cb0deffed
Reviewed-on: https://cl.tvl.fyi/c/depot/+/1249
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Reviewed-by: Kane York <rikingcoding@gmail.com>
This commit is contained in:
Griffin Smith 2020-07-17 09:30:04 -04:00 committed by glittershark
parent 3f4e5050cd
commit a79df261b4
6 changed files with 133 additions and 1 deletions

View file

@ -18,6 +18,50 @@
namespace nix {
std::optional<BuildMode> build_mode_from(nix::proto::BuildMode mode) {
switch (mode) {
case nix::proto::BuildMode::Normal:
return BuildMode::bmNormal;
case nix::proto::BuildMode::Repair:
return BuildMode::bmRepair;
case nix::proto::BuildMode::Check:
return BuildMode::bmCheck;
default:
return {};
}
}
nix::proto::BuildStatus BuildResult::status_to_proto() {
switch (status) {
case BuildResult::Status::Built:
return proto::BuildStatus::Built;
case BuildResult::Status::Substituted:
return proto::BuildStatus::Substituted;
case BuildResult::Status::AlreadyValid:
return proto::BuildStatus::AlreadyValid;
case BuildResult::Status::PermanentFailure:
return proto::BuildStatus::PermanentFailure;
case BuildResult::Status::InputRejected:
return proto::BuildStatus::InputRejected;
case BuildResult::Status::OutputRejected:
return proto::BuildStatus::OutputRejected;
case BuildResult::Status::TransientFailure:
return proto::BuildStatus::TransientFailure;
case BuildResult::Status::CachedFailure:
return proto::BuildStatus::CachedFailure;
case BuildResult::Status::TimedOut:
return proto::BuildStatus::TimedOut;
case BuildResult::Status::MiscFailure:
return proto::BuildStatus::MiscFailure;
case BuildResult::Status::DependencyFailed:
return proto::BuildStatus::DependencyFailed;
case BuildResult::Status::LogLimitExceeded:
return proto::BuildStatus::LogLimitExceeded;
case BuildResult::Status::NotDeterministic:
return proto::BuildStatus::NotDeterministic;
}
}
bool Store::isInStore(const Path& path) const {
return isInDir(path, storeDir);
}