about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlorian Klink <flokli@flokli.de>2023-10-09T15·23+0200
committerclbot <clbot@tvl.fyi>2023-10-09T22·05+0000
commit28cd4b1a2f98759dc33390db78f328f20f2db515 (patch)
tree880ac973a14c38cb0385330e0c5085f063af096e
parent92481825b36f914bc99cbb15d560865d808b2306 (diff)
feat(tvix/nar-bridge): add ToNixNarInfo() r/6758
Convenience function, moves all code converting from a PathInfo struct
to to go-nix's NarInfo.

Change-Id: Idf0dcc38675674563f2dfd3286a4a55fa2a24a82
Reviewed-on: https://cl.tvl.fyi/c/depot/+/9593
Autosubmit: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Reviewed-by: Brian McGee <brian@bmcgee.ie>
-rw-r--r--tvix/default.nix2
-rw-r--r--tvix/nar-bridge/pkg/http/narinfo.go49
-rw-r--r--tvix/nar-bridge/pkg/http/narinfo_get.go38
-rw-r--r--tvix/store/protos/go.mod2
-rw-r--r--tvix/store/protos/go.sum4
5 files changed, 56 insertions, 39 deletions
diff --git a/tvix/default.nix b/tvix/default.nix
index 802ec9497f..f8513ffac5 100644
--- a/tvix/default.nix
+++ b/tvix/default.nix
@@ -108,7 +108,7 @@ in
   store-protos-go = pkgs.buildGoModule {
     name = "store-golang";
     src = depot.third_party.gitignoreSource ./store/protos;
-    vendorHash = "sha256-L+mHTUYRZu8PSbD7LJ9QRuW1+ImIYbH9/SKgAoL9W8w=";
+    vendorHash = "sha256-injKuXHUvjyJraZOyDWoKD4NXIdQJS7VorpWyoNo1jk=";
   };
 
   # Build the Rust documentation for publishing on docs.tvix.dev.
diff --git a/tvix/nar-bridge/pkg/http/narinfo.go b/tvix/nar-bridge/pkg/http/narinfo.go
new file mode 100644
index 0000000000..5d963c34f9
--- /dev/null
+++ b/tvix/nar-bridge/pkg/http/narinfo.go
@@ -0,0 +1,49 @@
+package http
+
+import (
+	"fmt"
+
+	storev1pb "code.tvl.fyi/tvix/store/protos"
+	nixhash "github.com/nix-community/go-nix/pkg/hash"
+	"github.com/nix-community/go-nix/pkg/narinfo"
+	"github.com/nix-community/go-nix/pkg/narinfo/signature"
+	"github.com/nix-community/go-nix/pkg/nixbase32"
+)
+
+// ToNixNarInfo converts the PathInfo to a narinfo.NarInfo.
+func ToNixNarInfo(p *storev1pb.PathInfo) (*narinfo.NarInfo, error) {
+	// ensure the PathInfo is valid, and extract the StorePath from the node in
+	// there.
+	storePath, err := p.Validate()
+	if err != nil {
+		return nil, fmt.Errorf("failed to validate PathInfo: %w", err)
+	}
+
+	// convert the signatures from storev1pb signatures to narinfo signatures
+	narinfoSignatures := make([]signature.Signature, len(p.GetNarinfo().GetSignatures()))
+	for i, pathInfoSignature := range p.GetNarinfo().GetSignatures() {
+		narinfoSignatures[i] = signature.Signature{
+			Name: pathInfoSignature.GetName(),
+			Data: pathInfoSignature.GetData(),
+		}
+	}
+
+	// produce nixhash for the narsha256.
+	narHash, err := nixhash.FromHashTypeAndDigest(
+		0x12, // SHA2_256
+		p.GetNarinfo().GetNarSha256(),
+	)
+	if err != nil {
+		return nil, fmt.Errorf("invalid narsha256: %w", err)
+	}
+
+	return &narinfo.NarInfo{
+		StorePath:   storePath.Absolute(),
+		URL:         "nar/" + nixbase32.EncodeToString(narHash.Digest()) + ".nar",
+		Compression: "none",
+		NarHash:     narHash,
+		NarSize:     uint64(p.GetNarinfo().GetNarSize()),
+		References:  p.GetNarinfo().GetReferenceNames(),
+		Signatures:  narinfoSignatures,
+	}, nil
+}
diff --git a/tvix/nar-bridge/pkg/http/narinfo_get.go b/tvix/nar-bridge/pkg/http/narinfo_get.go
index 93192c03e5..8338d43676 100644
--- a/tvix/nar-bridge/pkg/http/narinfo_get.go
+++ b/tvix/nar-bridge/pkg/http/narinfo_get.go
@@ -8,18 +8,13 @@ import (
 	"io"
 	"io/fs"
 	"net/http"
-	"path"
 	"strings"
 	"sync"
 
-	castorev1pb "code.tvl.fyi/tvix/castore/protos"
 	storev1pb "code.tvl.fyi/tvix/store/protos"
 	"github.com/go-chi/chi/v5"
 	nixhash "github.com/nix-community/go-nix/pkg/hash"
-	"github.com/nix-community/go-nix/pkg/narinfo"
-	"github.com/nix-community/go-nix/pkg/narinfo/signature"
 	"github.com/nix-community/go-nix/pkg/nixbase32"
-	"github.com/nix-community/go-nix/pkg/storepath"
 	log "github.com/sirupsen/logrus"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
@@ -71,37 +66,10 @@ func renderNarinfo(
 		return nil
 	}
 
-	// convert the signatures from storev1pb signatures to narinfo signatures
-	narinfoSignatures := make([]signature.Signature, 0)
-	for _, pathInfoSignature := range pathInfo.Narinfo.Signatures {
-		narinfoSignatures = append(narinfoSignatures, signature.Signature{
-			Name: pathInfoSignature.GetName(),
-			Data: pathInfoSignature.GetData(),
-		})
-	}
-
-	// extract the name of the node in the pathInfo structure, which will become the output path
-	var nodeName []byte
-	switch v := (pathInfo.GetNode().GetNode()).(type) {
-	case *castorev1pb.Node_File:
-		nodeName = v.File.GetName()
-	case *castorev1pb.Node_Symlink:
-		nodeName = v.Symlink.GetName()
-	case *castorev1pb.Node_Directory:
-		nodeName = v.Directory.GetName()
-	}
-
-	narInfo := narinfo.NarInfo{
-		StorePath:   path.Join(storepath.StoreDir, string(nodeName)),
-		URL:         "nar/" + nixbase32.EncodeToString(narHash.Digest()) + ".nar",
-		Compression: "none", // TODO: implement zstd compression
-		NarHash:     narHash,
-		NarSize:     uint64(pathInfo.Narinfo.NarSize),
-		References:  pathInfo.Narinfo.GetReferenceNames(),
-		Signatures:  narinfoSignatures,
-	}
+	// convert the PathInfo to NARInfo.
+	narInfo, err := ToNixNarInfo(pathInfo)
 
-	// render .narinfo from pathInfo
+	// Write it out to the client.
 	_, err = io.Copy(w, strings.NewReader(narInfo.String()))
 	if err != nil {
 		return fmt.Errorf("unable to write narinfo to client: %w", err)
diff --git a/tvix/store/protos/go.mod b/tvix/store/protos/go.mod
index 5c6306f517..607f13cad4 100644
--- a/tvix/store/protos/go.mod
+++ b/tvix/store/protos/go.mod
@@ -4,7 +4,7 @@ go 1.19
 
 require (
 	code.tvl.fyi/tvix/castore/protos v0.0.0-20230922125121-72355662d742
-	github.com/nix-community/go-nix v0.0.0-20231005143722-b0f8b73c06df
+	github.com/nix-community/go-nix v0.0.0-20231009143713-ebca3299475b
 	github.com/stretchr/testify v1.8.1
 	google.golang.org/grpc v1.51.0
 	google.golang.org/protobuf v1.28.1
diff --git a/tvix/store/protos/go.sum b/tvix/store/protos/go.sum
index b5b92a74d6..c199331449 100644
--- a/tvix/store/protos/go.sum
+++ b/tvix/store/protos/go.sum
@@ -30,8 +30,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/nix-community/go-nix v0.0.0-20231005143722-b0f8b73c06df h1:n4I26uXUST5vmdsDWPo9ikK57il4htQyhnsLWoHYFmY=
-github.com/nix-community/go-nix v0.0.0-20231005143722-b0f8b73c06df/go.mod h1:hHM9UK2zOCjvmiLgeaW4LVbOW/vBaRWFJGzfi31/slQ=
+github.com/nix-community/go-nix v0.0.0-20231009143713-ebca3299475b h1:AWEKOdDO3JnHApQDOmONEKLXbMCQJhYJJfJpiWB9VGI=
+github.com/nix-community/go-nix v0.0.0-20231009143713-ebca3299475b/go.mod h1:hHM9UK2zOCjvmiLgeaW4LVbOW/vBaRWFJGzfi31/slQ=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=