From 209489e348904aa2e2cddc64340ea44ab3074dfd Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Sat, 1 Aug 2020 20:23:53 -0400 Subject: feat(3p/nix): Implement two more RPC calls Implement AddTextToStore and BuildPaths both on the client and the server Refs: #29 Change-Id: I45294c3e1c1a7489e42099d36425b7acc04e0427 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1560 Reviewed-by: kanepyork Tested-by: BuildkiteCI --- third_party/nix/src/libstore/rpc-store.cc | 27 ++++++++++++++-- third_party/nix/src/libstore/store-api.cc | 14 ++++++++- third_party/nix/src/libstore/store-api.hh | 5 ++- third_party/nix/src/nix-daemon/nix-daemon-proto.cc | 36 +++++++++++++++++++++- 4 files changed, 76 insertions(+), 6 deletions(-) (limited to 'third_party') diff --git a/third_party/nix/src/libstore/rpc-store.cc b/third_party/nix/src/libstore/rpc-store.cc index ba7d77fb08..4a55e09967 100644 --- a/third_party/nix/src/libstore/rpc-store.cc +++ b/third_party/nix/src/libstore/rpc-store.cc @@ -214,9 +214,23 @@ Path RpcStore::addToStore(const std::string& name, const Path& srcPath, throw absl::StrCat("Not implemented ", __func__); } -Path RpcStore::addTextToStore(const std::string& name, const std::string& s, +Path RpcStore::addTextToStore(const std::string& name, + const std::string& content, const PathSet& references, RepairFlag repair) { - throw absl::StrCat("Not implemented ", __func__); + if (repair != 0u) { + throw Error( + "repairing is not supported when building through the Nix daemon"); + } + ClientContext ctx; + proto::AddTextToStoreRequest request; + request.set_name(name); + request.set_content(content); + for (const auto& ref : references) { + request.add_references(ref); + } + proto::StorePath result; + SuccessOrThrow(stub_->AddTextToStore(&ctx, request, &result)); + return result.path(); } void RpcStore::narFromPath(const Path& path, Sink& sink) { @@ -224,7 +238,14 @@ void RpcStore::narFromPath(const Path& path, Sink& sink) { } void RpcStore::buildPaths(const PathSet& paths, BuildMode buildMode) { - throw absl::StrCat("Not implemented ", __func__); + ClientContext ctx; + proto::BuildPathsRequest request; + for (const auto& path : paths) { + request.add_drvs(path); + } + google::protobuf::Empty response; + request.set_mode(nix::BuildModeToProto(buildMode)); + SuccessOrThrow(stub_->BuildPaths(&ctx, request, &response)); } BuildResult RpcStore::buildDerivation(const Path& drvPath, diff --git a/third_party/nix/src/libstore/store-api.cc b/third_party/nix/src/libstore/store-api.cc index 2598c4ce2e..444ec73cc7 100644 --- a/third_party/nix/src/libstore/store-api.cc +++ b/third_party/nix/src/libstore/store-api.cc @@ -10,6 +10,7 @@ #include #include +#include "libproto/worker.pb.h" #include "libstore/crypto.hh" #include "libstore/derivations.hh" #include "libstore/globals.hh" @@ -21,7 +22,7 @@ namespace nix { -std::optional build_mode_from(nix::proto::BuildMode mode) { +std::optional BuildModeFrom(nix::proto::BuildMode mode) { switch (mode) { case nix::proto::BuildMode::Normal: return BuildMode::bmNormal; @@ -34,6 +35,17 @@ std::optional build_mode_from(nix::proto::BuildMode mode) { } } +nix::proto::BuildMode BuildModeToProto(BuildMode mode) { + switch (mode) { + case BuildMode::bmNormal: + return nix::proto::BuildMode::Normal; + case BuildMode::bmRepair: + return nix::proto::BuildMode::Repair; + case BuildMode::bmCheck: + return nix::proto::BuildMode::Check; + } +} + nix::proto::BuildStatus BuildResult::status_to_proto() { switch (status) { case BuildResult::Status::Built: diff --git a/third_party/nix/src/libstore/store-api.hh b/third_party/nix/src/libstore/store-api.hh index 327a08c852..7764ae8b83 100644 --- a/third_party/nix/src/libstore/store-api.hh +++ b/third_party/nix/src/libstore/store-api.hh @@ -184,7 +184,10 @@ enum BuildMode { bmNormal, bmRepair, bmCheck }; // Convert the proto version of a `nix::proto::BuildMode` to its corresponding // nix `BuildMode` -std::optional build_mode_from(nix::proto::BuildMode mode); +std::optional BuildModeFrom(nix::proto::BuildMode mode); + +// Convert a `nix::BuildMode` to its corresponding proto representation +nix::proto::BuildMode BuildModeToProto(BuildMode mode); struct BuildResult { /* Note: don't remove status codes, and only add new status codes diff --git a/third_party/nix/src/nix-daemon/nix-daemon-proto.cc b/third_party/nix/src/nix-daemon/nix-daemon-proto.cc index 63c68ed1e5..bf65dd315d 100644 --- a/third_party/nix/src/nix-daemon/nix-daemon-proto.cc +++ b/third_party/nix/src/nix-daemon/nix-daemon-proto.cc @@ -172,6 +172,40 @@ class WorkerServiceImpl final : public WorkerService::Service { return Status::OK; } + Status AddTextToStore(grpc::ServerContext*, + const nix::proto::AddTextToStoreRequest* request, + nix::proto::StorePath* response) override { + PathSet references; + for (const auto& ref : request->references()) { + references.insert(ref); + } + auto path = + store_->addTextToStore(request->name(), request->content(), references); + response->set_path(path); + return Status::OK; + } + + Status BuildPaths(grpc::ServerContext*, + const nix::proto::BuildPathsRequest* request, + google::protobuf::Empty*) override { + PathSet drvs; + for (const auto& drv : request->drvs()) { + drvs.insert(drv); + } + auto mode = BuildModeFrom(request->mode()); + + if (!mode.has_value()) { + return Status(grpc::StatusCode::INTERNAL, "Invalid build mode"); + } + + // TODO(grfn): If mode is repair and not trusted, we need to return an error + // here (but we can't yet because we don't know anything about trusted + // users) + store_->buildPaths(drvs, mode.value()); + + return Status::OK; + } + Status QuerySubstitutablePathInfos( grpc::ServerContext*, const StorePaths* request, nix::proto::SubstitutablePathInfos* response) override { @@ -357,7 +391,7 @@ class WorkerServiceImpl final : public WorkerService::Service { store_->assertStorePath(drv_path); auto drv = BasicDerivation::from_proto(&request->derivation(), *store_); - auto build_mode = nix::build_mode_from(request->build_mode()); + auto build_mode = nix::BuildModeFrom(request->build_mode()); if (!build_mode) { return Status(grpc::StatusCode::INTERNAL, "Invalid build mode"); } -- cgit 1.4.1