diff options
author | Florian Klink <flokli@flokli.de> | 2024-05-14T10·35+0200 |
---|---|---|
committer | clbot <clbot@tvl.fyi> | 2024-05-15T21·31+0000 |
commit | 1392913e981ae4edbec6ef39a4d3de44749ad81c (patch) | |
tree | 899672eac93c185a11a125e2f8d1c41367edbf17 /tvix/nar-bridge-go/pkg/http/narinfo_put.go | |
parent | ce1aa10b694662a3bb4061184312de7a422cfe42 (diff) |
chore(tvix/nar-bridge): move to nar-bridge-go r/8147
Make some space for the rust implementation. Change-Id: I924dc1657be10abe5a11951c3b9de50bae06db19 Reviewed-on: https://cl.tvl.fyi/c/depot/+/11662 Tested-by: BuildkiteCI Autosubmit: flokli <flokli@flokli.de> Reviewed-by: yuka <yuka@yuka.dev>
Diffstat (limited to 'tvix/nar-bridge-go/pkg/http/narinfo_put.go')
-rw-r--r-- | tvix/nar-bridge-go/pkg/http/narinfo_put.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/tvix/nar-bridge-go/pkg/http/narinfo_put.go b/tvix/nar-bridge-go/pkg/http/narinfo_put.go new file mode 100644 index 000000000000..0e2ae989c039 --- /dev/null +++ b/tvix/nar-bridge-go/pkg/http/narinfo_put.go @@ -0,0 +1,103 @@ +package http + +import ( + "net/http" + + "code.tvl.fyi/tvix/nar-bridge-go/pkg/importer" + "github.com/go-chi/chi/v5" + "github.com/nix-community/go-nix/pkg/narinfo" + "github.com/nix-community/go-nix/pkg/nixbase32" + "github.com/sirupsen/logrus" + log "github.com/sirupsen/logrus" +) + +func registerNarinfoPut(s *Server) { + s.handler.Put("/{outputhash:^["+nixbase32.Alphabet+"]{32}}.narinfo", func(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + + ctx := r.Context() + log := log.WithField("outputhash", chi.URLParamFromCtx(ctx, "outputhash")) + + // TODO: decide on merging behaviour. + // Maybe it's fine to add if contents are the same, but more sigs can be added? + // Right now, just replace a .narinfo for a path that already exists. + + // read and parse the .narinfo file + narInfo, err := narinfo.Parse(r.Body) + if err != nil { + log.WithError(err).Error("unable to parse narinfo") + w.WriteHeader(http.StatusBadRequest) + _, err := w.Write([]byte("unable to parse narinfo")) + if err != nil { + log.WithError(err).Errorf("unable to write error message to client") + } + + return + } + + log = log.WithFields(logrus.Fields{ + "narhash": narInfo.NarHash.SRIString(), + "output_path": narInfo.StorePath, + }) + + // look up the narHash in our temporary map + s.narDbMu.Lock() + narData, found := s.narDb[narInfo.NarHash.SRIString()] + s.narDbMu.Unlock() + if !found { + log.Error("unable to find referred NAR") + w.WriteHeader(http.StatusBadRequest) + _, err := w.Write([]byte("unable to find referred NAR")) + if err != nil { + log.WithError(err).Errorf("unable to write error message to client") + } + + return + } + + rootNode := narData.rootNode + + // compare fields with what we computed while receiving the NAR file + + // NarSize needs to match + if narData.narSize != narInfo.NarSize { + log.Error("narsize mismatch") + w.WriteHeader(http.StatusBadRequest) + _, err := w.Write([]byte("unable to parse narinfo")) + if err != nil { + log.WithError(err).Errorf("unable to write error message to client") + } + + return + } + + pathInfo, err := importer.GenPathInfo(rootNode, narInfo) + if err != nil { + log.WithError(err).Error("unable to generate PathInfo") + + w.WriteHeader(http.StatusInternalServerError) + _, err := w.Write([]byte("unable to generate PathInfo")) + if err != nil { + log.WithError(err).Errorf("unable to write error message to client") + } + + return + } + + log.WithField("pathInfo", pathInfo).Debug("inserted new pathInfo") + + receivedPathInfo, err := s.pathInfoServiceClient.Put(ctx, pathInfo) + if err != nil { + log.WithError(err).Error("unable to upload pathinfo to service") + w.WriteHeader(http.StatusInternalServerError) + _, err := w.Write([]byte("unable to upload pathinfo to server")) + if err != nil { + log.WithError(err).Errorf("unable to write error message to client") + } + + return + } + + log.WithField("pathInfo", receivedPathInfo).Debug("got back PathInfo") + }) +} |