From 7cfac04b7ddab313a894eb57c654d7c0a9babb41 Mon Sep 17 00:00:00 2001 From: Florian Klink Date: Tue, 30 Jul 2024 15:54:14 +0300 Subject: [PATCH] chore(tvix): drop nar-bridge-go This functionality exists in nar-bridge(-rs) now. Change-Id: I717484ef64aafad9466c982d2aa8195fe8b98bb9 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12065 Tested-by: BuildkiteCI Autosubmit: flokli Reviewed-by: Ilan Joselevich --- tvix/README.md | 2 +- tvix/docs/src/store/api.md | 2 +- tvix/nar-bridge-go/.gitignore | 2 - tvix/nar-bridge-go/README.md | 7 - .../nar-bridge-go/cmd/nar-bridge-http/main.go | 93 --- .../nar-bridge-go/cmd/nar-bridge-http/otel.go | 87 --- tvix/nar-bridge-go/default.nix | 10 - tvix/nar-bridge-go/go.mod | 54 -- tvix/nar-bridge-go/go.sum | 120 ---- tvix/nar-bridge-go/pkg/http/nar_get.go | 197 ------- tvix/nar-bridge-go/pkg/http/nar_put.go | 141 ----- tvix/nar-bridge-go/pkg/http/narinfo.go | 51 -- tvix/nar-bridge-go/pkg/http/narinfo_get.go | 137 ----- tvix/nar-bridge-go/pkg/http/narinfo_put.go | 103 ---- tvix/nar-bridge-go/pkg/http/server.go | 119 ---- tvix/nar-bridge-go/pkg/http/util.go | 24 - .../nar-bridge-go/pkg/importer/blob_upload.go | 71 --- .../pkg/importer/counting_writer.go | 21 - .../pkg/importer/directory_upload.go | 88 --- .../pkg/importer/gen_pathinfo.go | 62 -- tvix/nar-bridge-go/pkg/importer/importer.go | 303 ---------- .../pkg/importer/importer_test.go | 537 ------------------ .../pkg/importer/roundtrip_test.go | 85 --- tvix/nar-bridge-go/pkg/importer/util_test.go | 34 -- .../nar-bridge-go/testdata/emptydirectory.nar | Bin 96 -> 0 bytes ...vsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar | Bin 464152 -> 0 bytes .../testdata/onebyteexecutable.nar | Bin 152 -> 0 bytes .../nar-bridge-go/testdata/onebyteregular.nar | Bin 120 -> 0 bytes .../nar-bridge-go/testdata/popdirectories.nar | Bin 600 -> 0 bytes tvix/nar-bridge-go/testdata/symlink.nar | Bin 136 -> 0 bytes 30 files changed, 2 insertions(+), 2348 deletions(-) delete mode 100644 tvix/nar-bridge-go/.gitignore delete mode 100644 tvix/nar-bridge-go/README.md delete mode 100644 tvix/nar-bridge-go/cmd/nar-bridge-http/main.go delete mode 100644 tvix/nar-bridge-go/cmd/nar-bridge-http/otel.go delete mode 100644 tvix/nar-bridge-go/default.nix delete mode 100644 tvix/nar-bridge-go/go.mod delete mode 100644 tvix/nar-bridge-go/go.sum delete mode 100644 tvix/nar-bridge-go/pkg/http/nar_get.go delete mode 100644 tvix/nar-bridge-go/pkg/http/nar_put.go delete mode 100644 tvix/nar-bridge-go/pkg/http/narinfo.go delete mode 100644 tvix/nar-bridge-go/pkg/http/narinfo_get.go delete mode 100644 tvix/nar-bridge-go/pkg/http/narinfo_put.go delete mode 100644 tvix/nar-bridge-go/pkg/http/server.go delete mode 100644 tvix/nar-bridge-go/pkg/http/util.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/blob_upload.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/counting_writer.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/directory_upload.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/gen_pathinfo.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/importer.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/importer_test.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/roundtrip_test.go delete mode 100644 tvix/nar-bridge-go/pkg/importer/util_test.go delete mode 100644 tvix/nar-bridge-go/testdata/emptydirectory.nar delete mode 100644 tvix/nar-bridge-go/testdata/nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar delete mode 100644 tvix/nar-bridge-go/testdata/onebyteexecutable.nar delete mode 100644 tvix/nar-bridge-go/testdata/onebyteregular.nar delete mode 100644 tvix/nar-bridge-go/testdata/popdirectories.nar delete mode 100644 tvix/nar-bridge-go/testdata/symlink.nar diff --git a/tvix/README.md b/tvix/README.md index 7f3fcc061..af12d6ff4 100644 --- a/tvix/README.md +++ b/tvix/README.md @@ -61,7 +61,7 @@ This folder contains the following components: * `//tvix/castore` - subtree storage/transfer in a content-addressed fashion * `//tvix/cli` - preliminary REPL & CLI implementation for Tvix * `//tvix/eval` - an implementation of the Nix programming language -* `//tvix/nar-bridge-go` - a HTTP webserver providing a Nix HTTP Binary Cache interface in front of a tvix-store +* `//tvix/nar-bridge` - a HTTP webserver providing a Nix HTTP Binary Cache interface in front of a tvix-store * `//tvix/nix-compat` - a Rust library for compatibility with C++ Nix, features like encodings and hashing schemes and formats * `//tvix/serde` - a Rust library for using the Nix language for app configuration * `//tvix/store` - a "filesystem" linking Nix store paths and metadata with the content-addressed layer diff --git a/tvix/docs/src/store/api.md b/tvix/docs/src/store/api.md index b20ec0e8b..89495a0d1 100644 --- a/tvix/docs/src/store/api.md +++ b/tvix/docs/src/store/api.md @@ -217,7 +217,7 @@ This is useful for people running a Tvix-only system, or running builds on a In a system with Nix installed, we can't simply manually "extract" things to `/nix/store`, as Nix assumes to own all writes to this location. In these use cases, we're probably better off exposing a tvix-store as a local -binary cache (that's what `//tvix/nar-bridge-go` does). +binary cache (that's what `//tvix/nar-bridge` does). Assuming we are in an environment where we control `/nix/store` exclusively, a "realize to disk" would either "extract" things from the `tvix-store` to a diff --git a/tvix/nar-bridge-go/.gitignore b/tvix/nar-bridge-go/.gitignore deleted file mode 100644 index d70e1f812..000000000 --- a/tvix/nar-bridge-go/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/nar-bridge-http -/nar-bridge-pathinfo diff --git a/tvix/nar-bridge-go/README.md b/tvix/nar-bridge-go/README.md deleted file mode 100644 index 81431daf3..000000000 --- a/tvix/nar-bridge-go/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# //tvix/nar-bridge-go - -This exposes a HTTP Binary cache interface (GET/HEAD/PUT requests) for a `tvix- -store`. - -It can be used to configure a tvix-store as a substitutor for Nix, or to upload -store paths from Nix via `nix copy` into a `tvix-store`. diff --git a/tvix/nar-bridge-go/cmd/nar-bridge-http/main.go b/tvix/nar-bridge-go/cmd/nar-bridge-http/main.go deleted file mode 100644 index cf2aaf490..000000000 --- a/tvix/nar-bridge-go/cmd/nar-bridge-http/main.go +++ /dev/null @@ -1,93 +0,0 @@ -package main - -import ( - "context" - "os" - "os/signal" - "runtime/debug" - "time" - - "github.com/alecthomas/kong" - - "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - narBridgeHttp "code.tvl.fyi/tvix/nar-bridge-go/pkg/http" - storev1pb "code.tvl.fyi/tvix/store-go" - log "github.com/sirupsen/logrus" -) - -// `help:"Expose a tvix-store gRPC Interface as HTTP NAR/NARinfo"` -var cli struct { - LogLevel string `enum:"trace,debug,info,warn,error,fatal,panic" help:"The log level to log with" default:"info"` - ListenAddr string `name:"listen-addr" help:"The address this service listens on" type:"string" default:"[::]:9000"` //nolint:lll - EnableAccessLog bool `name:"access-log" help:"Enable access logging" type:"bool" default:"true" negatable:""` //nolint:lll - StoreAddr string `name:"store-addr" help:"The address to the tvix-store RPC interface this will connect to" default:"localhost:8000"` //nolint:lll - EnableOtlp bool `name:"otlp" help:"Enable OpenTelemetry for logs, spans, and metrics" default:"true"` //nolint:lll -} - -func main() { - _ = kong.Parse(&cli) - - logLevel, err := log.ParseLevel(cli.LogLevel) - if err != nil { - log.Panic("invalid log level") - return - } - log.SetLevel(logLevel) - - ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) - defer stop() - - if cli.EnableOtlp { - buildInfo, ok := debug.ReadBuildInfo() - if !ok { - log.Fatal("failed to read build info") - } - - shutdown, err := setupOpenTelemetry(ctx, "nar-bridge-http", buildInfo.Main.Version) - if err != nil { - log.WithError(err).Fatal("failed to setup OpenTelemetry") - } - defer shutdown(context.Background()) - } - - // connect to tvix-store - log.Debugf("Dialing to %v", cli.StoreAddr) - conn, err := grpc.DialContext(ctx, cli.StoreAddr, - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithStatsHandler(otelgrpc.NewClientHandler()), - ) - if err != nil { - log.Fatalf("did not connect: %v", err) - } - defer conn.Close() - - s := narBridgeHttp.New( - castorev1pb.NewDirectoryServiceClient(conn), - castorev1pb.NewBlobServiceClient(conn), - storev1pb.NewPathInfoServiceClient(conn), - cli.EnableAccessLog, - 30, - ) - - log.Printf("Starting nar-bridge-http at %v", cli.ListenAddr) - go s.ListenAndServe(cli.ListenAddr) - - // listen for the interrupt signal. - <-ctx.Done() - - // Restore default behaviour on the interrupt signal - stop() - log.Info("Received Signal, shutting down, press Ctl+C again to force.") - - timeoutCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - if err := s.Shutdown(timeoutCtx); err != nil { - log.WithError(err).Warn("failed to shutdown") - os.Exit(1) - } -} diff --git a/tvix/nar-bridge-go/cmd/nar-bridge-http/otel.go b/tvix/nar-bridge-go/cmd/nar-bridge-http/otel.go deleted file mode 100644 index c446c6ec1..000000000 --- a/tvix/nar-bridge-go/cmd/nar-bridge-http/otel.go +++ /dev/null @@ -1,87 +0,0 @@ -package main - -import ( - "context" - "errors" - - "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/sdk/metric" - "go.opentelemetry.io/otel/sdk/resource" - "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.24.0" -) - -func setupOpenTelemetry(ctx context.Context, serviceName, serviceVersion string) (func(context.Context) error, error) { - var shutdownFuncs []func(context.Context) error - shutdown := func(ctx context.Context) error { - var err error - for _, fn := range shutdownFuncs { - err = errors.Join(err, fn(ctx)) - } - shutdownFuncs = nil - return err - } - - res, err := resource.Merge( - resource.Default(), - resource.NewWithAttributes( - semconv.SchemaURL, - semconv.ServiceName(serviceName), - semconv.ServiceVersion(serviceVersion), - ), - ) - if err != nil { - return nil, errors.Join(err, shutdown(ctx)) - } - - prop := propagation.NewCompositeTextMapPropagator( - propagation.TraceContext{}, - propagation.Baggage{}, - ) - otel.SetTextMapPropagator(prop) - - tracerProvider, err := newTraceProvider(ctx, res) - if err != nil { - return nil, errors.Join(err, shutdown(ctx)) - } - shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown) - otel.SetTracerProvider(tracerProvider) - - meterProvider, err := newMeterProvider(ctx, res) - if err != nil { - return nil, errors.Join(err, shutdown(ctx)) - } - shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown) - otel.SetMeterProvider(meterProvider) - - return shutdown, nil -} - -func newTraceProvider(ctx context.Context, res *resource.Resource) (*trace.TracerProvider, error) { - traceExporter, err := otlptracegrpc.New(ctx) - if err != nil { - return nil, err - } - - traceProvider := trace.NewTracerProvider( - trace.WithBatcher(traceExporter), - trace.WithResource(res), - ) - return traceProvider, nil -} - -func newMeterProvider(ctx context.Context, res *resource.Resource) (*metric.MeterProvider, error) { - metricExporter, err := otlpmetricgrpc.New(ctx) - if err != nil { - return nil, err - } - - meterProvider := metric.NewMeterProvider( - metric.WithResource(res), - metric.WithReader(metric.NewPeriodicReader(metricExporter)), - ) - return meterProvider, nil -} diff --git a/tvix/nar-bridge-go/default.nix b/tvix/nar-bridge-go/default.nix deleted file mode 100644 index 303d9c504..000000000 --- a/tvix/nar-bridge-go/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -# Target containing just the proto files. - -{ depot, pkgs, lib, ... }: - -pkgs.buildGoModule { - name = "nar-bridge-go"; - src = depot.third_party.gitignoreSource ./.; - - vendorHash = "sha256-7jugbC5sEGhppjiZgnoLP5A6kQSaHK9vE6cXVZBG22s="; -} diff --git a/tvix/nar-bridge-go/go.mod b/tvix/nar-bridge-go/go.mod deleted file mode 100644 index 3aa0694ff..000000000 --- a/tvix/nar-bridge-go/go.mod +++ /dev/null @@ -1,54 +0,0 @@ -module code.tvl.fyi/tvix/nar-bridge-go - -require ( - code.tvl.fyi/tvix/castore-go v0.0.0-20231105151352-990d6ba2175e - code.tvl.fyi/tvix/store-go v0.0.0-20231105203234-f2baad42494f - github.com/alecthomas/kong v0.7.1 - github.com/go-chi/chi v1.5.4 - github.com/go-chi/chi/v5 v5.0.7 - github.com/google/go-cmp v0.6.0 - github.com/multiformats/go-multihash v0.2.1 - github.com/nix-community/go-nix v0.0.0-20231012070617-9b176785e54d - github.com/sirupsen/logrus v1.9.0 - github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 - go.opentelemetry.io/otel v1.22.0 - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.45.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 - go.opentelemetry.io/otel/sdk v1.22.0 - go.opentelemetry.io/otel/sdk/metric v1.22.0 - golang.org/x/sync v0.4.0 - google.golang.org/grpc v1.60.1 - google.golang.org/protobuf v1.32.0 - lukechampine.com/blake3 v1.2.1 -) - -require ( - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-logr/logr v1.4.1 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/minio/sha256-simd v1.0.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-varint v0.0.6 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 // indirect - go.opentelemetry.io/otel/metric v1.22.0 // indirect - go.opentelemetry.io/otel/trace v1.22.0 // indirect - go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) - -go 1.19 diff --git a/tvix/nar-bridge-go/go.sum b/tvix/nar-bridge-go/go.sum deleted file mode 100644 index 39f77b906..000000000 --- a/tvix/nar-bridge-go/go.sum +++ /dev/null @@ -1,120 +0,0 @@ -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -code.tvl.fyi/tvix/castore-go v0.0.0-20231105151352-990d6ba2175e h1:Nj+anfyEYeEdhnIo2BG/N1ZwQl1IvI7AH3TbNDLwUOA= -code.tvl.fyi/tvix/castore-go v0.0.0-20231105151352-990d6ba2175e/go.mod h1:+vKbozsa04yy2TWh3kUVU568jaza3Hf0p1jAEoMoCwA= -code.tvl.fyi/tvix/store-go v0.0.0-20231105203234-f2baad42494f h1:bN3K7oSu3IAHXqS3ETHUgpBPHF9+awKKBRLiM8/1tmI= -code.tvl.fyi/tvix/store-go v0.0.0-20231105203234-f2baad42494f/go.mod h1:8jpfSC2rGi6VKaKOqqgmflPVSEpUawuRQFwQpQYCMiA= -github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= -github.com/alecthomas/kong v0.7.1 h1:azoTh0IOfwlAX3qN9sHWTxACE2oV8Bg2gAwBsMwDQY4= -github.com/alecthomas/kong v0.7.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= -github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= -github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= -github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108= -github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc= -github.com/multiformats/go-varint v0.0.6 h1:gk85QWKxh3TazbLxED/NlDVv8+q+ReFJk7Y2W/KhfNY= -github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/nix-community/go-nix v0.0.0-20231012070617-9b176785e54d h1:kwc1ivTuStqa3iBC2M/ojWPor88+YeIbZGeD2SlMYZ0= -github.com/nix-community/go-nix v0.0.0-20231012070617-9b176785e54d/go.mod h1:4ZJah5sYrUSsWXIOJIsQ6iVOQyLO+ffhWXU3gblcO+E= -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/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0 h1:UNQQKPfTDe1J81ViolILjTKPr9WetKW6uei2hFgJmFs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.47.0/go.mod h1:r9vWsPS/3AQItv3OSlEJ/E4mbrhUbbw18meOjArPtKQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= -go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y= -go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.45.0 h1:tfil6di0PoNV7FZdsCS7A5izZoVVQ7AuXtyekbOpG/I= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.45.0/go.mod h1:AKFZIEPOnqB00P63bTjOiah4ZTaRzl1TKwUWpZdYUHI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0 h1:H2JFgRcGiyHg7H7bwcwaQJYrNFqCqrbTQ8K4p1OvDu8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.22.0/go.mod h1:WfCWp1bGoYK8MeULtI15MmQVczfR+bFkk0DF3h06QmQ= -go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg= -go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY= -go.opentelemetry.io/otel/sdk v1.22.0 h1:6coWHw9xw7EfClIC/+O31R8IY3/+EiRFHevmHafB2Gw= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/sdk/metric v1.22.0 h1:ARrRetm1HCVxq0cbnaZQlfwODYJHo3gFL8Z3tSmHBcI= -go.opentelemetry.io/otel/sdk/metric v1.22.0/go.mod h1:KjQGeMIDlBNEOo6HvjhxIec1p/69/kULDcp4gr0oLQQ= -go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0= -go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= -google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405 h1:AB/lmRny7e2pLhFEYIbl5qkDAUt2h0ZRO4wGPhZf+ik= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= -google.golang.org/grpc v1.60.1 h1:26+wFr+cNqSGFcOXcabYC0lUVJVRa2Sb2ortSK7VrEU= -google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= diff --git a/tvix/nar-bridge-go/pkg/http/nar_get.go b/tvix/nar-bridge-go/pkg/http/nar_get.go deleted file mode 100644 index 75797f8da..000000000 --- a/tvix/nar-bridge-go/pkg/http/nar_get.go +++ /dev/null @@ -1,197 +0,0 @@ -package http - -import ( - "bytes" - "context" - "encoding/base64" - "encoding/hex" - "errors" - "fmt" - "io" - "io/fs" - "net/http" - "sync" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - storev1pb "code.tvl.fyi/tvix/store-go" - "github.com/go-chi/chi/v5" - nixhash "github.com/nix-community/go-nix/pkg/hash" - "github.com/nix-community/go-nix/pkg/nixbase32" - log "github.com/sirupsen/logrus" -) - -const ( - narUrl = "/nar/{narhash:^([" + nixbase32.Alphabet + "]{52})$}.nar" -) - -func renderNar( - ctx context.Context, - log *log.Entry, - directoryServiceClient castorev1pb.DirectoryServiceClient, - blobServiceClient castorev1pb.BlobServiceClient, - narHashDbMu *sync.Mutex, - narHashDb map[string]*narData, - w io.Writer, - narHash *nixhash.Hash, - headOnly bool, -) error { - // look in the lookup table - narHashDbMu.Lock() - narData, found := narHashDb[narHash.SRIString()] - narHashDbMu.Unlock() - - rootNode := narData.rootNode - - // if we didn't find anything, return 404. - if !found { - return fmt.Errorf("narHash not found: %w", fs.ErrNotExist) - } - - // if this was only a head request, we're done. - if headOnly { - return nil - } - - directories := make(map[string]*castorev1pb.Directory) - - // If the root node is a directory, ask the directory service for all directories - if pathInfoDirectory := rootNode.GetDirectory(); pathInfoDirectory != nil { - rootDirectoryDigest := pathInfoDirectory.GetDigest() - log = log.WithField("root_directory", base64.StdEncoding.EncodeToString(rootDirectoryDigest)) - - directoryStream, err := directoryServiceClient.Get(ctx, &castorev1pb.GetDirectoryRequest{ - ByWhat: &castorev1pb.GetDirectoryRequest_Digest{ - Digest: rootDirectoryDigest, - }, - Recursive: true, - }) - if err != nil { - return fmt.Errorf("unable to query directory stream: %w", err) - } - - // For now, we just stream all of these locally and put them into a hashmap, - // which is used in the lookup function below. - for { - directory, err := directoryStream.Recv() - if err != nil { - if err == io.EOF { - break - } - return fmt.Errorf("unable to receive from directory stream: %w", err) - } - - // calculate directory digest - // TODO: do we need to do any more validation? - directoryDgst, err := directory.Digest() - if err != nil { - return fmt.Errorf("unable to calculate directory digest: %w", err) - } - - log.WithField("directory", base64.StdEncoding.EncodeToString(directoryDgst)).Debug("received directory node") - - directories[hex.EncodeToString(directoryDgst)] = directory - } - - } - - // render the NAR file - err := storev1pb.Export( - w, - rootNode, - func(directoryDigest []byte) (*castorev1pb.Directory, error) { - log.WithField("directory", base64.StdEncoding.EncodeToString(directoryDigest)).Debug("Get directory") - directoryRefStr := hex.EncodeToString(directoryDigest) - directory, found := directories[directoryRefStr] - if !found { - return nil, fmt.Errorf( - "directory with hash %v does not exist: %w", - directoryDigest, - fs.ErrNotExist, - ) - } - - return directory, nil - }, - func(blobDigest []byte) (io.ReadCloser, error) { - log.WithField("blob", base64.StdEncoding.EncodeToString(blobDigest)).Debug("Get blob") - resp, err := blobServiceClient.Read(ctx, &castorev1pb.ReadBlobRequest{ - Digest: blobDigest, - }) - if err != nil { - return nil, fmt.Errorf("unable to get blob: %w", err) - } - - // set up a pipe, let a goroutine write, return the reader. - pR, pW := io.Pipe() - - go func() { - for { - chunk, err := resp.Recv() - if errors.Is(err, io.EOF) { - break - } - if err != nil { - pW.CloseWithError(fmt.Errorf("receiving chunk: %w", err)) - return - } - - // write the received chunk to the writer part of the pipe - if _, err := io.Copy(pW, bytes.NewReader(chunk.GetData())); err != nil { - log.WithError(err).Error("writing chunk to pipe") - pW.CloseWithError(fmt.Errorf("writing chunk to pipe: %w", err)) - return - } - } - pW.Close() - - }() - - return io.NopCloser(pR), nil - }, - ) - if err != nil { - return fmt.Errorf("unable to export nar: %w", err) - } - return nil -} - -func registerNarGet(s *Server) { - // produce a handler for rendering NAR files. - genNarHandler := func(isHead bool) func(w http.ResponseWriter, r *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - ctx := r.Context() - - // parse the narhash sent in the request URL - narHash, err := parseNarHashFromUrl(chi.URLParamFromCtx(ctx, "narhash")) - if err != nil { - log.WithError(err).WithField("url", r.URL).Error("unable to decode nar hash from url") - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("unable to decode nar hash from url")) - if err != nil { - log.WithError(err).Errorf("unable to write error message to client") - } - - return - } - - log := log.WithField("narhash_url", narHash.SRIString()) - - // TODO: inline more of that function here? - err = renderNar(ctx, log, s.directoryServiceClient, s.blobServiceClient, &s.narDbMu, s.narDb, w, narHash, isHead) - if err != nil { - if errors.Is(err, fs.ErrNotExist) { - w.WriteHeader(http.StatusNotFound) - } else { - log.WithError(err).Warn("unable to render nar") - w.WriteHeader(http.StatusInternalServerError) - } - } - - } - } - - s.handler.Head(narUrl, genNarHandler(true)) - s.handler.Get(narUrl, genNarHandler(false)) -} diff --git a/tvix/nar-bridge-go/pkg/http/nar_put.go b/tvix/nar-bridge-go/pkg/http/nar_put.go deleted file mode 100644 index 96bdd38b7..000000000 --- a/tvix/nar-bridge-go/pkg/http/nar_put.go +++ /dev/null @@ -1,141 +0,0 @@ -package http - -import ( - "bufio" - "bytes" - "fmt" - "net/http" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - "code.tvl.fyi/tvix/nar-bridge-go/pkg/importer" - "github.com/go-chi/chi/v5" - mh "github.com/multiformats/go-multihash/core" - nixhash "github.com/nix-community/go-nix/pkg/hash" - "github.com/sirupsen/logrus" - log "github.com/sirupsen/logrus" -) - -func registerNarPut(s *Server) { - s.handler.Put(narUrl, func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - ctx := r.Context() - - // parse the narhash sent in the request URL - narHashFromUrl, err := parseNarHashFromUrl(chi.URLParamFromCtx(ctx, "narhash")) - if err != nil { - log.WithError(err).WithField("url", r.URL).Error("unable to decode nar hash from url") - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("unable to decode nar hash from url")) - if err != nil { - log.WithError(err).Error("unable to write error message to client") - } - - return - } - - log := log.WithField("narhash_url", narHashFromUrl.SRIString()) - - directoriesUploader := importer.NewDirectoriesUploader(ctx, s.directoryServiceClient) - defer directoriesUploader.Done() //nolint:errcheck - - rootNode, narSize, narSha256, err := importer.Import( - ctx, - // buffer the body by 10MiB - bufio.NewReaderSize(r.Body, 10*1024*1024), - importer.GenBlobUploaderCb(ctx, s.blobServiceClient), - func(directory *castorev1pb.Directory) ([]byte, error) { - return directoriesUploader.Put(directory) - }, - ) - - if err != nil { - log.Errorf("error during NAR import: %v", err) - w.WriteHeader(http.StatusInternalServerError) - _, err := w.Write([]byte(fmt.Sprintf("error during NAR import: %v", err))) - if err != nil { - log.WithError(err).Errorf("unable to write error message to client") - } - - return - } - - log.Debug("closing the stream") - - // Close the directories uploader - directoriesPutResponse, err := directoriesUploader.Done() - if err != nil { - log.WithError(err).Error("error during directory upload") - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("error during directory upload")) - if err != nil { - log.WithError(err).Errorf("unable to write error message to client") - } - - return - } - // If we uploaded directories (so directoriesPutResponse doesn't return null), - // the RootDigest field in directoriesPutResponse should match the digest - // returned in the PathInfo struct returned by the `Import` call. - // This check ensures the server-side came up with the same root hash. - - if directoriesPutResponse != nil { - rootDigestPathInfo := rootNode.GetDirectory().GetDigest() - rootDigestDirectoriesPutResponse := directoriesPutResponse.GetRootDigest() - - log := log.WithFields(logrus.Fields{ - "root_digest_pathinfo": rootDigestPathInfo, - "root_digest_directories_put_resp": rootDigestDirectoriesPutResponse, - }) - if !bytes.Equal(rootDigestPathInfo, rootDigestDirectoriesPutResponse) { - log.Errorf("returned root digest doesn't match what's calculated") - - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("error in root digest calculation")) - if err != nil { - log.WithError(err).Error("unable to write error message to client") - } - - return - } - } - - // Compare the nar hash specified in the URL with the one that has been - // calculated while processing the NAR file. - narHash, err := nixhash.FromHashTypeAndDigest(mh.SHA2_256, narSha256) - if err != nil { - panic("must parse nixbase32") - } - - if !bytes.Equal(narHashFromUrl.Digest(), narHash.Digest()) { - log := log.WithFields(logrus.Fields{ - "narhash_received_sha256": narHash.SRIString(), - "narsize": narSize, - }) - log.Error("received bytes don't match narhash from URL") - - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("received bytes don't match narHash specified in URL")) - if err != nil { - log.WithError(err).Errorf("unable to write error message to client") - } - - return - } - - // Insert the partial pathinfo structs into our lookup map, - // so requesting the NAR file will be possible. - // The same might exist already, but it'll have the same contents (so - // replacing will be a no-op), except maybe the root node Name field value, which - // is safe to ignore (as not part of the NAR). - s.narDbMu.Lock() - s.narDb[narHash.SRIString()] = &narData{ - rootNode: rootNode, - narSize: narSize, - } - s.narDbMu.Unlock() - - // Done! - }) - -} diff --git a/tvix/nar-bridge-go/pkg/http/narinfo.go b/tvix/nar-bridge-go/pkg/http/narinfo.go deleted file mode 100644 index e5b99a950..000000000 --- a/tvix/nar-bridge-go/pkg/http/narinfo.go +++ /dev/null @@ -1,51 +0,0 @@ -package http - -import ( - "fmt" - - storev1pb "code.tvl.fyi/tvix/store-go" - mh "github.com/multiformats/go-multihash/core" - 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( - mh.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-go/pkg/http/narinfo_get.go b/tvix/nar-bridge-go/pkg/http/narinfo_get.go deleted file mode 100644 index d43cb5807..000000000 --- a/tvix/nar-bridge-go/pkg/http/narinfo_get.go +++ /dev/null @@ -1,137 +0,0 @@ -package http - -import ( - "context" - "encoding/base64" - "errors" - "fmt" - "io" - "io/fs" - "net/http" - "strings" - "sync" - - storev1pb "code.tvl.fyi/tvix/store-go" - "github.com/go-chi/chi/v5" - nixhash "github.com/nix-community/go-nix/pkg/hash" - "github.com/nix-community/go-nix/pkg/nixbase32" - log "github.com/sirupsen/logrus" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// renderNarinfo writes narinfo contents to a passed io.Writer, or a returns a -// (wrapped) io.ErrNoExist error if something doesn't exist. -// if headOnly is set to true, only the existence is checked, but no content is -// actually written. -func renderNarinfo( - ctx context.Context, - log *log.Entry, - pathInfoServiceClient storev1pb.PathInfoServiceClient, - narHashToPathInfoMu *sync.Mutex, - narHashToPathInfo map[string]*narData, - outputHash []byte, - w io.Writer, - headOnly bool, -) error { - pathInfo, err := pathInfoServiceClient.Get(ctx, &storev1pb.GetPathInfoRequest{ - ByWhat: &storev1pb.GetPathInfoRequest_ByOutputHash{ - ByOutputHash: outputHash, - }, - }) - if err != nil { - st, ok := status.FromError(err) - if ok { - if st.Code() == codes.NotFound { - return fmt.Errorf("output hash %v not found: %w", base64.StdEncoding.EncodeToString(outputHash), fs.ErrNotExist) - } - return fmt.Errorf("unable to get pathinfo, code %v: %w", st.Code(), err) - } - - return fmt.Errorf("unable to get pathinfo: %w", err) - } - - log = log.WithField("pathInfo", pathInfo) - - if _, err := pathInfo.Validate(); err != nil { - log.WithError(err).Error("unable to validate PathInfo") - - return fmt.Errorf("unable to validate PathInfo: %w", err) - } - - if pathInfo.GetNarinfo() == nil { - log.Error("PathInfo doesn't contain Narinfo field") - - return fmt.Errorf("PathInfo doesn't contain Narinfo field") - } - - // extract the NARHash. This must succeed, as Validate() did succeed. - narHash, err := nixhash.FromHashTypeAndDigest(0x12, pathInfo.GetNarinfo().GetNarSha256()) - if err != nil { - panic("must parse NarHash") - } - - // add things to the lookup table, in case the same process didn't handle the NAR hash yet. - narHashToPathInfoMu.Lock() - narHashToPathInfo[narHash.SRIString()] = &narData{ - rootNode: pathInfo.GetNode(), - narSize: pathInfo.GetNarinfo().GetNarSize(), - } - narHashToPathInfoMu.Unlock() - - if headOnly { - return nil - } - - // convert the PathInfo to NARInfo. - narInfo, err := ToNixNarInfo(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) - } - - return nil -} - -func registerNarinfoGet(s *Server) { - // GET/HEAD $outHash.narinfo looks up the PathInfo from the tvix-store, - // and, if it's a GET request, render a .narinfo file to the client. - // In both cases it will keep the PathInfo in the lookup map, - // so a subsequent GET/HEAD /nar/ $narhash.nar request can find it. - genNarinfoHandler := func(isHead bool) func(w http.ResponseWriter, r *http.Request) { - return func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - - ctx := r.Context() - log := log.WithField("outputhash", chi.URLParamFromCtx(ctx, "outputhash")) - - // parse the output hash sent in the request URL - outputHash, err := nixbase32.DecodeString(chi.URLParamFromCtx(ctx, "outputhash")) - if err != nil { - log.WithError(err).Error("unable to decode output hash from url") - w.WriteHeader(http.StatusBadRequest) - _, err := w.Write([]byte("unable to decode output hash from url")) - if err != nil { - log.WithError(err).Errorf("unable to write error message to client") - } - - return - } - - err = renderNarinfo(ctx, log, s.pathInfoServiceClient, &s.narDbMu, s.narDb, outputHash, w, isHead) - if err != nil { - if errors.Is(err, fs.ErrNotExist) { - w.WriteHeader(http.StatusNotFound) - } else { - log.WithError(err).Warn("unable to render narinfo") - w.WriteHeader(http.StatusInternalServerError) - } - } - } - } - - s.handler.Get("/{outputhash:^["+nixbase32.Alphabet+"]{32}}.narinfo", genNarinfoHandler(false)) - s.handler.Head("/{outputhash:^["+nixbase32.Alphabet+"]{32}}.narinfo", genNarinfoHandler(true)) -} diff --git a/tvix/nar-bridge-go/pkg/http/narinfo_put.go b/tvix/nar-bridge-go/pkg/http/narinfo_put.go deleted file mode 100644 index 0e2ae989c..000000000 --- a/tvix/nar-bridge-go/pkg/http/narinfo_put.go +++ /dev/null @@ -1,103 +0,0 @@ -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") - }) -} diff --git a/tvix/nar-bridge-go/pkg/http/server.go b/tvix/nar-bridge-go/pkg/http/server.go deleted file mode 100644 index fbcb20be1..000000000 --- a/tvix/nar-bridge-go/pkg/http/server.go +++ /dev/null @@ -1,119 +0,0 @@ -package http - -import ( - "context" - "fmt" - "net" - "net/http" - "strings" - "sync" - "time" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - storev1pb "code.tvl.fyi/tvix/store-go" - "github.com/go-chi/chi/middleware" - "github.com/go-chi/chi/v5" - log "github.com/sirupsen/logrus" - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" -) - -type Server struct { - srv *http.Server - handler chi.Router - - directoryServiceClient castorev1pb.DirectoryServiceClient - blobServiceClient castorev1pb.BlobServiceClient - pathInfoServiceClient storev1pb.PathInfoServiceClient - - // When uploading NAR files to a HTTP binary cache, the .nar - // files are uploaded before the .narinfo files. - // We need *both* to be able to fully construct a PathInfo object. - // Keep a in-memory map of narhash(es) (in SRI) to (unnamed) root node and nar - // size. - // This is necessary until we can ask a PathInfoService for a node with a given - // narSha256. - narDbMu sync.Mutex - narDb map[string]*narData -} - -type narData struct { - rootNode *castorev1pb.Node - narSize uint64 -} - -func New( - directoryServiceClient castorev1pb.DirectoryServiceClient, - blobServiceClient castorev1pb.BlobServiceClient, - pathInfoServiceClient storev1pb.PathInfoServiceClient, - enableAccessLog bool, - priority int, -) *Server { - r := chi.NewRouter() - r.Use(func(h http.Handler) http.Handler { - return otelhttp.NewHandler(h, "http.request") - }) - - if enableAccessLog { - r.Use(middleware.Logger) - } - - r.Get("/", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("nar-bridge")) - if err != nil { - log.Errorf("Unable to write response: %v", err) - } - }) - - r.Get("/nix-cache-info", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte(fmt.Sprintf("StoreDir: /nix/store\nWantMassQuery: 1\nPriority: %d\n", priority))) - if err != nil { - log.Errorf("Unable to write response: %v", err) - } - }) - - s := &Server{ - handler: r, - directoryServiceClient: directoryServiceClient, - blobServiceClient: blobServiceClient, - pathInfoServiceClient: pathInfoServiceClient, - narDb: make(map[string]*narData), - } - - registerNarPut(s) - registerNarinfoPut(s) - - registerNarinfoGet(s) - registerNarGet(s) - - return s -} - -func (s *Server) Shutdown(ctx context.Context) error { - return s.srv.Shutdown(ctx) -} - -// ListenAndServer starts the webserver, and waits for it being closed or -// shutdown, after which it'll return ErrServerClosed. -func (s *Server) ListenAndServe(addr string) error { - s.srv = &http.Server{ - Handler: s.handler, - ReadTimeout: 500 * time.Second, - WriteTimeout: 500 * time.Second, - IdleTimeout: 500 * time.Second, - } - - var listener net.Listener - var err error - - // check addr. If it contains slashes, assume it's a unix domain socket. - if strings.Contains(addr, "/") { - listener, err = net.Listen("unix", addr) - } else { - listener, err = net.Listen("tcp", addr) - } - if err != nil { - return fmt.Errorf("unable to listen on %v: %w", addr, err) - } - - return s.srv.Serve(listener) -} diff --git a/tvix/nar-bridge-go/pkg/http/util.go b/tvix/nar-bridge-go/pkg/http/util.go deleted file mode 100644 index 60febea1f..000000000 --- a/tvix/nar-bridge-go/pkg/http/util.go +++ /dev/null @@ -1,24 +0,0 @@ -package http - -import ( - "fmt" - nixhash "github.com/nix-community/go-nix/pkg/hash" -) - -// parseNarHashFromUrl parses a nixbase32 string representing a sha256 NarHash -// and returns a nixhash.Hash when it was able to parse, or an error. -func parseNarHashFromUrl(narHashFromUrl string) (*nixhash.Hash, error) { - // peek at the length. If it's 52 characters, assume sha256, - // if it's something else, this is an error. - l := len(narHashFromUrl) - if l != 52 { - return nil, fmt.Errorf("invalid length of narHash: %v", l) - } - - nixHash, err := nixhash.ParseNixBase32("sha256:" + narHashFromUrl) - if err != nil { - return nil, fmt.Errorf("unable to parse nixbase32 hash: %w", err) - } - - return nixHash, nil -} diff --git a/tvix/nar-bridge-go/pkg/importer/blob_upload.go b/tvix/nar-bridge-go/pkg/importer/blob_upload.go deleted file mode 100644 index c1255dd3a..000000000 --- a/tvix/nar-bridge-go/pkg/importer/blob_upload.go +++ /dev/null @@ -1,71 +0,0 @@ -package importer - -import ( - "bufio" - "context" - "encoding/base64" - "errors" - "fmt" - "io" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - log "github.com/sirupsen/logrus" -) - -// the size of individual BlobChunk we send when uploading to BlobService. -const chunkSize = 1024 * 1024 - -// this produces a callback function that can be used as blobCb for the -// importer.Import function call. -func GenBlobUploaderCb(ctx context.Context, blobServiceClient castorev1pb.BlobServiceClient) func(io.Reader) ([]byte, error) { - return func(blobReader io.Reader) ([]byte, error) { - // Ensure the blobReader is buffered to at least the chunk size. - blobReader = bufio.NewReaderSize(blobReader, chunkSize) - - putter, err := blobServiceClient.Put(ctx) - if err != nil { - // return error to the importer - return nil, fmt.Errorf("error from blob service: %w", err) - } - - blobSize := 0 - chunk := make([]byte, chunkSize) - - for { - n, err := blobReader.Read(chunk) - if err != nil && !errors.Is(err, io.EOF) { - return nil, fmt.Errorf("unable to read from blobreader: %w", err) - } - - if n != 0 { - log.WithField("chunk_size", n).Debug("sending chunk") - blobSize += n - - // send the blob chunk to the server. The err is only valid in the inner scope - if err := putter.Send(&castorev1pb.BlobChunk{ - Data: chunk[:n], - }); err != nil { - return nil, fmt.Errorf("sending blob chunk: %w", err) - } - } - - // if our read from blobReader returned an EOF, we're done reading - if errors.Is(err, io.EOF) { - break - } - - } - - resp, err := putter.CloseAndRecv() - if err != nil { - return nil, fmt.Errorf("close blob putter: %w", err) - } - - log.WithFields(log.Fields{ - "blob_digest": base64.StdEncoding.EncodeToString(resp.GetDigest()), - "blob_size": blobSize, - }).Debug("uploaded blob") - - return resp.GetDigest(), nil - } -} diff --git a/tvix/nar-bridge-go/pkg/importer/counting_writer.go b/tvix/nar-bridge-go/pkg/importer/counting_writer.go deleted file mode 100644 index d003a4b11..000000000 --- a/tvix/nar-bridge-go/pkg/importer/counting_writer.go +++ /dev/null @@ -1,21 +0,0 @@ -package importer - -import ( - "io" -) - -// CountingWriter implements io.Writer. -var _ io.Writer = &CountingWriter{} - -type CountingWriter struct { - bytesWritten uint64 -} - -func (cw *CountingWriter) Write(p []byte) (n int, err error) { - cw.bytesWritten += uint64(len(p)) - return len(p), nil -} - -func (cw *CountingWriter) BytesWritten() uint64 { - return cw.bytesWritten -} diff --git a/tvix/nar-bridge-go/pkg/importer/directory_upload.go b/tvix/nar-bridge-go/pkg/importer/directory_upload.go deleted file mode 100644 index 117f442fa..000000000 --- a/tvix/nar-bridge-go/pkg/importer/directory_upload.go +++ /dev/null @@ -1,88 +0,0 @@ -package importer - -import ( - "bytes" - "context" - "encoding/base64" - "fmt" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - log "github.com/sirupsen/logrus" -) - -// DirectoriesUploader opens a Put stream when it receives the first Put() call, -// and then uses the opened stream for subsequent Put() calls. -// When the uploading is finished, a call to Done() will close the stream and -// return the root digest returned from the directoryServiceClient. -type DirectoriesUploader struct { - ctx context.Context - directoryServiceClient castorev1pb.DirectoryServiceClient - directoryServicePutStream castorev1pb.DirectoryService_PutClient - lastDirectoryDigest []byte -} - -func NewDirectoriesUploader(ctx context.Context, directoryServiceClient castorev1pb.DirectoryServiceClient) *DirectoriesUploader { - return &DirectoriesUploader{ - ctx: ctx, - directoryServiceClient: directoryServiceClient, - directoryServicePutStream: nil, - } -} - -func (du *DirectoriesUploader) Put(directory *castorev1pb.Directory) ([]byte, error) { - directoryDigest, err := directory.Digest() - if err != nil { - return nil, fmt.Errorf("failed calculating directory digest: %w", err) - } - - // Send the directory to the directory service - // If the stream hasn't been initialized yet, do it first - if du.directoryServicePutStream == nil { - directoryServicePutStream, err := du.directoryServiceClient.Put(du.ctx) - if err != nil { - return nil, fmt.Errorf("unable to initialize directory service put stream: %v", err) - } - du.directoryServicePutStream = directoryServicePutStream - } - - // send the directory out - err = du.directoryServicePutStream.Send(directory) - if err != nil { - return nil, fmt.Errorf("error sending directory: %w", err) - } - log.WithField("digest", base64.StdEncoding.EncodeToString(directoryDigest)).Debug("uploaded directory") - - // update lastDirectoryDigest - du.lastDirectoryDigest = directoryDigest - - return directoryDigest, nil -} - -// Done closes the stream and returns the response. -// It returns null if closed for a second time. -func (du *DirectoriesUploader) Done() (*castorev1pb.PutDirectoryResponse, error) { - // only close once, and only if we opened. - if du.directoryServicePutStream == nil { - return nil, nil - } - - putDirectoryResponse, err := du.directoryServicePutStream.CloseAndRecv() - if err != nil { - return nil, fmt.Errorf("unable to close directory service put stream: %v", err) - } - - // ensure the response contains the same digest as the one we have in lastDirectoryDigest. - // Otherwise, the backend came up with another digest than we, in which we return an error. - if !bytes.Equal(du.lastDirectoryDigest, putDirectoryResponse.RootDigest) { - return nil, fmt.Errorf( - "backend calculated different root digest as we, expected %s, actual %s", - base64.StdEncoding.EncodeToString(du.lastDirectoryDigest), - base64.StdEncoding.EncodeToString(putDirectoryResponse.RootDigest), - ) - } - - // clear directoryServicePutStream. - du.directoryServicePutStream = nil - - return putDirectoryResponse, nil -} diff --git a/tvix/nar-bridge-go/pkg/importer/gen_pathinfo.go b/tvix/nar-bridge-go/pkg/importer/gen_pathinfo.go deleted file mode 100644 index bdc298a9a..000000000 --- a/tvix/nar-bridge-go/pkg/importer/gen_pathinfo.go +++ /dev/null @@ -1,62 +0,0 @@ -package importer - -import ( - castorev1pb "code.tvl.fyi/tvix/castore-go" - storev1pb "code.tvl.fyi/tvix/store-go" - "fmt" - "github.com/nix-community/go-nix/pkg/narinfo" - "github.com/nix-community/go-nix/pkg/storepath" -) - -// GenPathInfo takes a rootNode and narInfo and assembles a PathInfo. -// The rootNode is renamed to match the StorePath in the narInfo. -func GenPathInfo(rootNode *castorev1pb.Node, narInfo *narinfo.NarInfo) (*storev1pb.PathInfo, error) { - // parse the storePath from the .narinfo - storePath, err := storepath.FromAbsolutePath(narInfo.StorePath) - if err != nil { - return nil, fmt.Errorf("unable to parse StorePath: %w", err) - } - - // construct the references, by parsing ReferenceNames and extracting the digest - references := make([][]byte, len(narInfo.References)) - for i, referenceStr := range narInfo.References { - // parse reference as store path - referenceStorePath, err := storepath.FromString(referenceStr) - if err != nil { - return nil, fmt.Errorf("unable to parse reference %s as storepath: %w", referenceStr, err) - } - references[i] = referenceStorePath.Digest - } - - // construct the narInfo.Signatures[*] from pathInfo.Narinfo.Signatures[*] - narinfoSignatures := make([]*storev1pb.NARInfo_Signature, len(narInfo.Signatures)) - for i, narinfoSig := range narInfo.Signatures { - narinfoSignatures[i] = &storev1pb.NARInfo_Signature{ - Name: narinfoSig.Name, - Data: narinfoSig.Data, - } - } - - // assemble the PathInfo. - pathInfo := &storev1pb.PathInfo{ - // embed a new root node with the name set to the store path basename. - Node: castorev1pb.RenamedNode(rootNode, storePath.String()), - References: references, - Narinfo: &storev1pb.NARInfo{ - NarSize: narInfo.NarSize, - NarSha256: narInfo.FileHash.Digest(), - Signatures: narinfoSignatures, - ReferenceNames: narInfo.References, - }, - } - - // run Validate on the PathInfo, more as an additional sanity check our code is sound, - // to make sure we populated everything properly, before returning it. - // Fail hard if we fail validation, this is a code error. - if _, err = pathInfo.Validate(); err != nil { - panic(fmt.Sprintf("PathInfo failed validation: %v", err)) - } - - return pathInfo, nil - -} diff --git a/tvix/nar-bridge-go/pkg/importer/importer.go b/tvix/nar-bridge-go/pkg/importer/importer.go deleted file mode 100644 index fce6c5f29..000000000 --- a/tvix/nar-bridge-go/pkg/importer/importer.go +++ /dev/null @@ -1,303 +0,0 @@ -package importer - -import ( - "bytes" - "context" - "crypto/sha256" - "errors" - "fmt" - "io" - "path" - "strings" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - "github.com/nix-community/go-nix/pkg/nar" - "golang.org/x/sync/errgroup" - "lukechampine.com/blake3" -) - -const ( - // asyncUploadThreshold controls when a file is buffered into memory and uploaded - // asynchronously. Files must be smaller than the threshold to be uploaded asynchronously. - asyncUploadThreshold = 1024 * 1024 // 1 MiB - // maxAsyncUploadBufferBytes is the maximum number of async blob uploads allowed to be - // running concurrently at any given time for a simple import operation. - maxConcurrentAsyncUploads = 128 -) - -// An item on the directories stack -type stackItem struct { - path string - directory *castorev1pb.Directory -} - -// Import reads a NAR from a reader, and returns a the root node, -// NAR size and NAR sha256 digest. -func Import( - // a context, to support cancellation - ctx context.Context, - // The reader the data is read from - r io.Reader, - // callback function called with each regular file content - blobCb func(fileReader io.Reader) ([]byte, error), - // callback function called with each finalized directory node - directoryCb func(directory *castorev1pb.Directory) ([]byte, error), -) (*castorev1pb.Node, uint64, []byte, error) { - // We need to wrap the underlying reader a bit. - // - we want to keep track of the number of bytes read in total - // - we calculate the sha256 digest over all data read - // Express these two things in a MultiWriter, and give the NAR reader a - // TeeReader that writes to it. - narCountW := &CountingWriter{} - sha256W := sha256.New() - multiW := io.MultiWriter(narCountW, sha256W) - narReader, err := nar.NewReader(io.TeeReader(r, multiW)) - if err != nil { - return nil, 0, nil, fmt.Errorf("failed to instantiate nar reader: %w", err) - } - defer narReader.Close() - - // If we store a symlink or regular file at the root, these are not nil. - // If they are nil, we instead have a stackDirectory. - var rootSymlink *castorev1pb.SymlinkNode - var rootFile *castorev1pb.FileNode - var stackDirectory *castorev1pb.Directory - - // Keep track of all asynch blob uploads so we can make sure they all succeed - // before returning. - var asyncBlobWg errgroup.Group - asyncBlobWg.SetLimit(maxConcurrentAsyncUploads) - - var stack = []stackItem{} - - // popFromStack is used when we transition to a different directory or - // drain the stack when we reach the end of the NAR. - // It adds the popped element to the element underneath if any, - // and passes it to the directoryCb callback. - // This function may only be called if the stack is not already empty. - popFromStack := func() error { - // Keep the top item, and "resize" the stack slice. - // This will only make the last element unaccessible, but chances are high - // we're re-using that space anyways. - toPop := stack[len(stack)-1] - stack = stack[:len(stack)-1] - - // call the directoryCb - directoryDigest, err := directoryCb(toPop.directory) - if err != nil { - return fmt.Errorf("failed calling directoryCb: %w", err) - } - - // if there's still a parent left on the stack, refer to it from there. - if len(stack) > 0 { - topOfStack := stack[len(stack)-1].directory - topOfStack.Directories = append(topOfStack.Directories, &castorev1pb.DirectoryNode{ - Name: []byte(path.Base(toPop.path)), - Digest: directoryDigest, - Size: toPop.directory.Size(), - }) - } - // Keep track that we have encounter at least one directory - stackDirectory = toPop.directory - return nil - } - - getBasename := func(p string) string { - // extract the basename. In case of "/", replace with empty string. - basename := path.Base(p) - if basename == "/" { - basename = "" - } - return basename - } - - for { - select { - case <-ctx.Done(): - return nil, 0, nil, ctx.Err() - default: - // call narReader.Next() to get the next element - hdr, err := narReader.Next() - - // If this returns an error, it's either EOF (when we're done reading from the NAR), - // or another error. - if err != nil { - // if this returns no EOF, bail out - if !errors.Is(err, io.EOF) { - return nil, 0, nil, fmt.Errorf("failed getting next nar element: %w", err) - } - - // The NAR has been read all the way to the end… - // Make sure we close the nar reader, which might read some final trailers. - if err := narReader.Close(); err != nil { - return nil, 0, nil, fmt.Errorf("unable to close nar reader: %w", err) - } - - // Check the stack. While it's not empty, we need to pop things off the stack. - for len(stack) > 0 { - err := popFromStack() - if err != nil { - return nil, 0, nil, fmt.Errorf("unable to pop from stack: %w", err) - } - } - - // Wait for any pending blob uploads. - err := asyncBlobWg.Wait() - if err != nil { - return nil, 0, nil, fmt.Errorf("async blob upload: %w", err) - } - - // Stack is empty. - // Now either root{File,Symlink,Directory} is not nil, - // and we can return the root node. - narSize := narCountW.BytesWritten() - narSha256 := sha256W.Sum(nil) - - if rootFile != nil { - return &castorev1pb.Node{ - Node: &castorev1pb.Node_File{ - File: rootFile, - }, - }, narSize, narSha256, nil - } else if rootSymlink != nil { - return &castorev1pb.Node{ - Node: &castorev1pb.Node_Symlink{ - Symlink: rootSymlink, - }, - }, narSize, narSha256, nil - } else if stackDirectory != nil { - // calculate directory digest (i.e. after we received all its contents) - dgst, err := stackDirectory.Digest() - if err != nil { - return nil, 0, nil, fmt.Errorf("unable to calculate root directory digest: %w", err) - } - - return &castorev1pb.Node{ - Node: &castorev1pb.Node_Directory{ - Directory: &castorev1pb.DirectoryNode{ - Name: []byte{}, - Digest: dgst, - Size: stackDirectory.Size(), - }, - }, - }, narSize, narSha256, nil - } else { - return nil, 0, nil, fmt.Errorf("no root set") - } - } - - // Check for valid path transitions, pop from stack if needed - // The nar reader already gives us some guarantees about ordering and illegal transitions, - // So we really only need to check if the top-of-stack path is a prefix of the path, - // and if it's not, pop from the stack. We do this repeatedly until the top of the stack is - // the subdirectory the new entry is in, or we hit the root directory. - - // We don't need to worry about the root node case, because we can only finish the root "/" - // If we're at the end of the NAR reader (covered by the EOF check) - for len(stack) > 1 && !strings.HasPrefix(hdr.Path, stack[len(stack)-1].path+"/") { - err := popFromStack() - if err != nil { - return nil, 0, nil, fmt.Errorf("unable to pop from stack: %w", err) - } - } - - if hdr.Type == nar.TypeSymlink { - symlinkNode := &castorev1pb.SymlinkNode{ - Name: []byte(getBasename(hdr.Path)), - Target: []byte(hdr.LinkTarget), - } - if len(stack) > 0 { - topOfStack := stack[len(stack)-1].directory - topOfStack.Symlinks = append(topOfStack.Symlinks, symlinkNode) - } else { - rootSymlink = symlinkNode - } - - } - if hdr.Type == nar.TypeRegular { - uploadBlob := func(r io.Reader) ([]byte, error) { - // wrap reader with a reader counting the number of bytes read - blobCountW := &CountingWriter{} - blobReader := io.TeeReader(r, blobCountW) - - blobDigest, err := blobCb(blobReader) - if err != nil { - return nil, fmt.Errorf("failure from blobCb: %w", err) - } - - // ensure blobCb did read all the way to the end. - // If it didn't, the blobCb function is wrong and we should bail out. - if blobCountW.BytesWritten() != uint64(hdr.Size) { - return nil, fmt.Errorf("blobCb did not read all: %d/%d bytes", blobCountW.BytesWritten(), hdr.Size) - } - - return blobDigest, nil - } - - h := blake3.New(32, nil) - blobReader := io.TeeReader(narReader, io.MultiWriter(h)) - var blobDigest []byte - - // If this file is small enough, read it off the wire immediately and - // upload to the blob service asynchronously. This helps reduce the - // RTT on blob uploads for NARs with many small files. - doAsync := hdr.Size < asyncUploadThreshold - if doAsync { - blobContents, err := io.ReadAll(blobReader) - if err != nil { - return nil, 0, nil, fmt.Errorf("read blob: %w", err) - } - - blobDigest = h.Sum(nil) - - asyncBlobWg.Go(func() error { - blobDigestFromCb, err := uploadBlob(bytes.NewReader(blobContents)) - if err != nil { - return err - } - - if !bytes.Equal(blobDigest, blobDigestFromCb) { - return fmt.Errorf("unexpected digest (got %x, expected %x)", blobDigestFromCb, blobDigest) - } - - return nil - }) - } else { - blobDigestFromCb, err := uploadBlob(blobReader) - if err != nil { - return nil, 0, nil, fmt.Errorf("upload blob: %w", err) - } - - blobDigest = h.Sum(nil) - if !bytes.Equal(blobDigest, blobDigestFromCb) { - return nil, 0, nil, fmt.Errorf("unexpected digest (got %x, expected %x)", blobDigestFromCb, blobDigest) - } - } - - fileNode := &castorev1pb.FileNode{ - Name: []byte(getBasename(hdr.Path)), - Digest: blobDigest, - Size: uint64(hdr.Size), - Executable: hdr.Executable, - } - if len(stack) > 0 { - topOfStack := stack[len(stack)-1].directory - topOfStack.Files = append(topOfStack.Files, fileNode) - } else { - rootFile = fileNode - } - } - if hdr.Type == nar.TypeDirectory { - directory := &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{}, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - stack = append(stack, stackItem{ - directory: directory, - path: hdr.Path, - }) - } - } - } -} diff --git a/tvix/nar-bridge-go/pkg/importer/importer_test.go b/tvix/nar-bridge-go/pkg/importer/importer_test.go deleted file mode 100644 index 313677084..000000000 --- a/tvix/nar-bridge-go/pkg/importer/importer_test.go +++ /dev/null @@ -1,537 +0,0 @@ -package importer_test - -import ( - "bytes" - "context" - "errors" - "io" - "os" - "testing" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - "code.tvl.fyi/tvix/nar-bridge-go/pkg/importer" - "github.com/stretchr/testify/require" -) - -func TestSymlink(t *testing.T) { - f, err := os.Open("../../testdata/symlink.nar") - require.NoError(t, err) - - rootNode, narSize, narSha256, err := importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - panic("no file contents expected!") - }, func(directory *castorev1pb.Directory) ([]byte, error) { - panic("no directories expected!") - }, - ) - require.NoError(t, err) - require.Equal(t, &castorev1pb.Node{ - Node: &castorev1pb.Node_Symlink{ - Symlink: &castorev1pb.SymlinkNode{ - Name: []byte(""), - Target: []byte("/nix/store/somewhereelse"), - }, - }, - }, rootNode) - require.Equal(t, []byte{ - 0x09, 0x7d, 0x39, 0x7e, 0x9b, 0x58, 0x26, 0x38, 0x4e, 0xaa, 0x16, 0xc4, 0x57, 0x71, 0x5d, 0x1c, 0x1a, 0x51, 0x67, 0x03, 0x13, 0xea, 0xd0, 0xf5, 0x85, 0x66, 0xe0, 0xb2, 0x32, 0x53, 0x9c, 0xf1, - }, narSha256) - require.Equal(t, uint64(136), narSize) -} - -func TestRegular(t *testing.T) { - f, err := os.Open("../../testdata/onebyteregular.nar") - require.NoError(t, err) - - rootNode, narSize, narSha256, err := importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - contents, err := io.ReadAll(blobReader) - require.NoError(t, err, "reading blobReader should not error") - require.Equal(t, []byte{0x01}, contents, "contents read from blobReader should match expectations") - return mustBlobDigest(bytes.NewBuffer(contents)), nil - }, func(directory *castorev1pb.Directory) ([]byte, error) { - panic("no directories expected!") - }, - ) - - // The blake3 digest of the 0x01 byte. - BLAKE3_DIGEST_0X01 := []byte{ - 0x48, 0xfc, 0x72, 0x1f, 0xbb, 0xc1, 0x72, 0xe0, 0x92, 0x5f, 0xa2, 0x7a, 0xf1, 0x67, 0x1d, - 0xe2, 0x25, 0xba, 0x92, 0x71, 0x34, 0x80, 0x29, 0x98, 0xb1, 0x0a, 0x15, 0x68, 0xa1, 0x88, - 0x65, 0x2b, - } - - require.NoError(t, err) - require.Equal(t, &castorev1pb.Node{ - Node: &castorev1pb.Node_File{ - File: &castorev1pb.FileNode{ - Name: []byte(""), - Digest: BLAKE3_DIGEST_0X01, - Size: 1, - Executable: false, - }, - }, - }, rootNode) - require.Equal(t, []byte{ - 0x73, 0x08, 0x50, 0xa8, 0x11, 0x25, 0x9d, 0xbf, 0x3a, 0x68, 0xdc, 0x2e, 0xe8, 0x7a, 0x79, 0xaa, 0x6c, 0xae, 0x9f, 0x71, 0x37, 0x5e, 0xdf, 0x39, 0x6f, 0x9d, 0x7a, 0x91, 0xfb, 0xe9, 0x13, 0x4d, - }, narSha256) - require.Equal(t, uint64(120), narSize) -} - -func TestEmptyDirectory(t *testing.T) { - f, err := os.Open("../../testdata/emptydirectory.nar") - require.NoError(t, err) - - expectedDirectory := &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{}, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - rootNode, narSize, narSha256, err := importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - panic("no file contents expected!") - }, func(directory *castorev1pb.Directory) ([]byte, error) { - requireProtoEq(t, expectedDirectory, directory) - return mustDirectoryDigest(directory), nil - }, - ) - require.NoError(t, err) - require.Equal(t, &castorev1pb.Node{ - Node: &castorev1pb.Node_Directory{ - Directory: &castorev1pb.DirectoryNode{ - Name: []byte(""), - Digest: mustDirectoryDigest(expectedDirectory), - Size: expectedDirectory.Size(), - }, - }, - }, rootNode) - require.Equal(t, []byte{ - 0xa5, 0x0a, 0x5a, 0xb6, 0xd9, 0x92, 0xf5, 0x59, 0x8e, 0xdd, 0x92, 0x10, 0x50, 0x59, 0xfa, 0xe9, 0xac, 0xfc, 0x19, 0x29, 0x81, 0xe0, 0x8b, 0xd8, 0x85, 0x34, 0xc2, 0x16, 0x7e, 0x92, 0x52, 0x6a, - }, narSha256) - require.Equal(t, uint64(96), narSize) -} - -func TestFull(t *testing.T) { - f, err := os.Open("../../testdata/nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar") - require.NoError(t, err) - - expectedDirectoryPaths := []string{ - "/bin", - "/share/man/man1", - "/share/man/man5", - "/share/man/man8", - "/share/man", - "/share", - "/", - } - expectedDirectories := make(map[string]*castorev1pb.Directory, len(expectedDirectoryPaths)) - - // /bin is a leaf directory - expectedDirectories["/bin"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{ - { - Name: []byte("arp"), - Digest: []byte{ - 0xfb, 0xc4, 0x61, 0x4a, 0x29, 0x27, 0x11, 0xcb, 0xcc, 0xe4, 0x99, 0x81, 0x9c, 0xf0, 0xa9, 0x17, 0xf7, 0xd0, 0x91, 0xbe, 0xea, 0x08, 0xcb, 0x5b, 0xaa, 0x76, 0x76, 0xf5, 0xee, 0x4f, 0x82, 0xbb, - }, - Size: 55288, - Executable: true, - }, - { - Name: []byte("hostname"), - Digest: []byte{ - 0x9c, 0x6a, 0xe4, 0xb5, 0xe4, 0x6c, 0xb5, 0x67, 0x45, 0x0e, 0xaa, 0x2a, 0xd8, 0xdd, 0x9b, 0x38, 0xd7, 0xed, 0x01, 0x02, 0x84, 0xf7, 0x26, 0xe1, 0xc7, 0xf3, 0x1c, 0xeb, 0xaa, 0x8a, 0x01, 0x30, - }, - Size: 17704, - Executable: true, - }, - { - Name: []byte("ifconfig"), - Digest: []byte{ - 0x25, 0xbe, 0x3b, 0x1d, 0xf4, 0x1a, 0x45, 0x42, 0x79, 0x09, 0x2c, 0x2a, 0x83, 0xf0, 0x0b, 0xff, 0xe8, 0xc0, 0x9c, 0x26, 0x98, 0x70, 0x15, 0x4d, 0xa8, 0xca, 0x05, 0xfe, 0x92, 0x68, 0x35, 0x2e, - }, - Size: 72576, - Executable: true, - }, - { - Name: []byte("nameif"), - Digest: []byte{ - 0x8e, 0xaa, 0xc5, 0xdb, 0x71, 0x08, 0x8e, 0xe5, 0xe6, 0x30, 0x1f, 0x2c, 0x3a, 0xf2, 0x42, 0x39, 0x0c, 0x57, 0x15, 0xaf, 0x50, 0xaa, 0x1c, 0xdf, 0x84, 0x22, 0x08, 0x77, 0x03, 0x54, 0x62, 0xb1, - }, - Size: 18776, - Executable: true, - }, - { - Name: []byte("netstat"), - Digest: []byte{ - 0x13, 0x34, 0x7e, 0xdd, 0x2a, 0x9a, 0x17, 0x0b, 0x3f, 0xc7, 0x0a, 0xe4, 0x92, 0x89, 0x25, 0x9f, 0xaa, 0xb5, 0x05, 0x6b, 0x24, 0xa7, 0x91, 0xeb, 0xaf, 0xf9, 0xe9, 0x35, 0x56, 0xaa, 0x2f, 0xb2, - }, - Size: 131784, - Executable: true, - }, - { - Name: []byte("plipconfig"), - Digest: []byte{ - 0x19, 0x7c, 0x80, 0xdc, 0x81, 0xdc, 0xb4, 0xc0, 0x45, 0xe1, 0xf9, 0x76, 0x51, 0x4f, 0x50, 0xbf, 0xa4, 0x69, 0x51, 0x9a, 0xd4, 0xa9, 0xe7, 0xaa, 0xe7, 0x0d, 0x53, 0x32, 0xff, 0x28, 0x40, 0x60, - }, - Size: 13160, - Executable: true, - }, - { - Name: []byte("rarp"), - Digest: []byte{ - 0x08, 0x85, 0xb4, 0x85, 0x03, 0x2b, 0x3c, 0x7a, 0x3e, 0x24, 0x4c, 0xf8, 0xcc, 0x45, 0x01, 0x9e, 0x79, 0x43, 0x8c, 0x6f, 0x5e, 0x32, 0x46, 0x54, 0xb6, 0x68, 0x91, 0x8e, 0xa0, 0xcb, 0x6e, 0x0d, - }, - Size: 30384, - Executable: true, - }, - { - Name: []byte("route"), - Digest: []byte{ - 0x4d, 0x14, 0x20, 0x89, 0x9e, 0x76, 0xf4, 0xe2, 0x92, 0x53, 0xee, 0x9b, 0x78, 0x7d, 0x23, 0x80, 0x6c, 0xff, 0xe6, 0x33, 0xdc, 0x4a, 0x10, 0x29, 0x39, 0x02, 0xa0, 0x60, 0xff, 0xe2, 0xbb, 0xd7, - }, - Size: 61928, - Executable: true, - }, - { - Name: []byte("slattach"), - Digest: []byte{ - 0xfb, 0x25, 0xc3, 0x73, 0xb7, 0xb1, 0x0b, 0x25, 0xcd, 0x7b, 0x62, 0xf6, 0x71, 0x83, 0xfe, 0x36, 0x80, 0xf6, 0x48, 0xc3, 0xdb, 0xd8, 0x0c, 0xfe, 0xb8, 0xd3, 0xda, 0x32, 0x9b, 0x47, 0x4b, 0x05, - }, - Size: 35672, - Executable: true, - }, - }, - Symlinks: []*castorev1pb.SymlinkNode{ - { - Name: []byte("dnsdomainname"), - Target: []byte("hostname"), - }, - { - Name: []byte("domainname"), - Target: []byte("hostname"), - }, - { - Name: []byte("nisdomainname"), - Target: []byte("hostname"), - }, - { - Name: []byte("ypdomainname"), - Target: []byte("hostname"), - }, - }, - } - - // /share/man/man1 is a leaf directory. - // The parser traversed over /sbin, but only added it to / which is still on the stack. - expectedDirectories["/share/man/man1"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{ - { - Name: []byte("dnsdomainname.1.gz"), - Digest: []byte{ - 0x98, 0x8a, 0xbd, 0xfa, 0x64, 0xd5, 0xb9, 0x27, 0xfe, 0x37, 0x43, 0x56, 0xb3, 0x18, 0xc7, 0x2b, 0xcb, 0xe3, 0x17, 0x1c, 0x17, 0xf4, 0x17, 0xeb, 0x4a, 0xa4, 0x99, 0x64, 0x39, 0xca, 0x2d, 0xee, - }, - Size: 40, - Executable: false, - }, - { - Name: []byte("domainname.1.gz"), - Digest: []byte{ - 0x98, 0x8a, 0xbd, 0xfa, 0x64, 0xd5, 0xb9, 0x27, 0xfe, 0x37, 0x43, 0x56, 0xb3, 0x18, 0xc7, 0x2b, 0xcb, 0xe3, 0x17, 0x1c, 0x17, 0xf4, 0x17, 0xeb, 0x4a, 0xa4, 0x99, 0x64, 0x39, 0xca, 0x2d, 0xee, - }, - Size: 40, - Executable: false, - }, - { - Name: []byte("hostname.1.gz"), - Digest: []byte{ - 0xbf, 0x89, 0xe6, 0x28, 0x00, 0x24, 0x66, 0x79, 0x70, 0x04, 0x38, 0xd6, 0xdd, 0x9d, 0xf6, 0x0e, 0x0d, 0xee, 0x00, 0xf7, 0x64, 0x4f, 0x05, 0x08, 0x9d, 0xf0, 0x36, 0xde, 0x85, 0xf4, 0x75, 0xdb, - }, - Size: 1660, - Executable: false, - }, - { - Name: []byte("nisdomainname.1.gz"), - Digest: []byte{ - 0x98, 0x8a, 0xbd, 0xfa, 0x64, 0xd5, 0xb9, 0x27, 0xfe, 0x37, 0x43, 0x56, 0xb3, 0x18, 0xc7, 0x2b, 0xcb, 0xe3, 0x17, 0x1c, 0x17, 0xf4, 0x17, 0xeb, 0x4a, 0xa4, 0x99, 0x64, 0x39, 0xca, 0x2d, 0xee, - }, - Size: 40, - Executable: false, - }, - { - Name: []byte("ypdomainname.1.gz"), - Digest: []byte{ - 0x98, 0x8a, 0xbd, 0xfa, 0x64, 0xd5, 0xb9, 0x27, 0xfe, 0x37, 0x43, 0x56, 0xb3, 0x18, 0xc7, 0x2b, 0xcb, 0xe3, 0x17, 0x1c, 0x17, 0xf4, 0x17, 0xeb, 0x4a, 0xa4, 0x99, 0x64, 0x39, 0xca, 0x2d, 0xee, - }, - Size: 40, - Executable: false, - }, - }, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - - // /share/man/man5 is a leaf directory - expectedDirectories["/share/man/man5"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{ - { - Name: []byte("ethers.5.gz"), - Digest: []byte{ - 0x42, 0x63, 0x8c, 0xc4, 0x18, 0x93, 0xcf, 0x60, 0xd6, 0xff, 0x43, 0xbc, 0x16, 0xb4, 0xfd, 0x22, 0xd2, 0xf2, 0x05, 0x0b, 0x52, 0xdc, 0x6a, 0x6b, 0xff, 0x34, 0xe2, 0x6a, 0x38, 0x3a, 0x07, 0xe3, - }, - Size: 563, - Executable: false, - }, - }, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - - // /share/man/man8 is a leaf directory - expectedDirectories["/share/man/man8"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{}, - Files: []*castorev1pb.FileNode{ - { - Name: []byte("arp.8.gz"), - Digest: []byte{ - 0xf5, 0x35, 0x4e, 0xf5, 0xf6, 0x44, 0xf7, 0x52, 0x0f, 0x42, 0xa0, 0x26, 0x51, 0xd9, 0x89, 0xf9, 0x68, 0xf2, 0xef, 0xeb, 0xba, 0xe1, 0xf4, 0x55, 0x01, 0x57, 0x77, 0xb7, 0x68, 0x55, 0x92, 0xef, - }, - Size: 2464, - Executable: false, - }, - { - Name: []byte("ifconfig.8.gz"), - Digest: []byte{ - 0x18, 0x65, 0x25, 0x11, 0x32, 0xee, 0x77, 0x91, 0x35, 0x4c, 0x3c, 0x24, 0xdb, 0xaf, 0x66, 0xdb, 0xfc, 0x17, 0x7b, 0xba, 0xe1, 0x3d, 0x05, 0xd2, 0xca, 0x6e, 0x2c, 0xe4, 0xef, 0xb8, 0xa8, 0xbe, - }, - Size: 3382, - Executable: false, - }, - { - Name: []byte("nameif.8.gz"), - Digest: []byte{ - 0x73, 0xc1, 0x27, 0xe8, 0x3b, 0xa8, 0x49, 0xdc, 0x0e, 0xdf, 0x70, 0x5f, 0xaf, 0x06, 0x01, 0x2c, 0x62, 0xe9, 0x18, 0x67, 0x01, 0x94, 0x64, 0x26, 0xca, 0x95, 0x22, 0xc0, 0xdc, 0xe4, 0x42, 0xb6, - }, - Size: 523, - Executable: false, - }, - { - Name: []byte("netstat.8.gz"), - Digest: []byte{ - 0xc0, 0x86, 0x43, 0x4a, 0x43, 0x57, 0xaa, 0x84, 0xa7, 0x24, 0xa0, 0x7c, 0x65, 0x38, 0x46, 0x1c, 0xf2, 0x45, 0xa2, 0xef, 0x12, 0x44, 0x18, 0xba, 0x52, 0x56, 0xe9, 0x8e, 0x6a, 0x0f, 0x70, 0x63, - }, - Size: 4284, - Executable: false, - }, - { - Name: []byte("plipconfig.8.gz"), - Digest: []byte{ - 0x2a, 0xd9, 0x1d, 0xa8, 0x9e, 0x0d, 0x05, 0xd0, 0xb0, 0x49, 0xaa, 0x64, 0xba, 0x29, 0x28, 0xc6, 0x45, 0xe1, 0xbb, 0x5e, 0x72, 0x8d, 0x48, 0x7b, 0x09, 0x4f, 0x0a, 0x82, 0x1e, 0x26, 0x83, 0xab, - }, - Size: 889, - Executable: false, - }, - { - Name: []byte("rarp.8.gz"), - Digest: []byte{ - 0x3d, 0x51, 0xc1, 0xd0, 0x6a, 0x59, 0x1e, 0x6d, 0x9a, 0xf5, 0x06, 0xd2, 0xe7, 0x7d, 0x7d, 0xd0, 0x70, 0x3d, 0x84, 0x64, 0xc3, 0x7d, 0xfb, 0x10, 0x84, 0x3b, 0xe1, 0xa9, 0xdf, 0x46, 0xee, 0x9f, - }, - Size: 1198, - Executable: false, - }, - { - Name: []byte("route.8.gz"), - Digest: []byte{ - 0x2a, 0x5a, 0x4b, 0x4f, 0x91, 0xf2, 0x78, 0xe4, 0xa9, 0x25, 0xb2, 0x7f, 0xa7, 0x2a, 0xc0, 0x8a, 0x4a, 0x65, 0xc9, 0x5f, 0x07, 0xa0, 0x48, 0x44, 0xeb, 0x46, 0xf9, 0xc9, 0xe1, 0x17, 0x96, 0x21, - }, - Size: 3525, - Executable: false, - }, - { - Name: []byte("slattach.8.gz"), - Digest: []byte{ - 0x3f, 0x05, 0x6b, 0x20, 0xe1, 0xe4, 0xf0, 0xba, 0x16, 0x15, 0x66, 0x6b, 0x57, 0x96, 0xe9, 0x9d, 0x83, 0xa8, 0x20, 0xaf, 0x8a, 0xca, 0x16, 0x4d, 0xa2, 0x6d, 0x94, 0x8e, 0xca, 0x91, 0x8f, 0xd4, - }, - Size: 1441, - Executable: false, - }, - }, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - - // /share/man holds /share/man/man{1,5,8}. - expectedDirectories["/share/man"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{ - { - Name: []byte("man1"), - Digest: mustDirectoryDigest(expectedDirectories["/share/man/man1"]), - Size: expectedDirectories["/share/man/man1"].Size(), - }, - { - Name: []byte("man5"), - Digest: mustDirectoryDigest(expectedDirectories["/share/man/man5"]), - Size: expectedDirectories["/share/man/man5"].Size(), - }, - { - Name: []byte("man8"), - Digest: mustDirectoryDigest(expectedDirectories["/share/man/man8"]), - Size: expectedDirectories["/share/man/man8"].Size(), - }, - }, - Files: []*castorev1pb.FileNode{}, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - - // /share holds /share/man. - expectedDirectories["/share"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{ - { - Name: []byte("man"), - Digest: mustDirectoryDigest(expectedDirectories["/share/man"]), - Size: expectedDirectories["/share/man"].Size(), - }, - }, - Files: []*castorev1pb.FileNode{}, - Symlinks: []*castorev1pb.SymlinkNode{}, - } - - // / holds /bin, /share, and a /sbin symlink. - expectedDirectories["/"] = &castorev1pb.Directory{ - Directories: []*castorev1pb.DirectoryNode{ - { - Name: []byte("bin"), - Digest: mustDirectoryDigest(expectedDirectories["/bin"]), - Size: expectedDirectories["/bin"].Size(), - }, - { - Name: []byte("share"), - Digest: mustDirectoryDigest(expectedDirectories["/share"]), - Size: expectedDirectories["/share"].Size(), - }, - }, - Files: []*castorev1pb.FileNode{}, - Symlinks: []*castorev1pb.SymlinkNode{ - { - Name: []byte("sbin"), - Target: []byte("bin"), - }, - }, - } - // assert we populated the two fixtures properly - require.Equal(t, len(expectedDirectoryPaths), len(expectedDirectories)) - - numDirectoriesReceived := 0 - - rootNode, narSize, narSha256, err := importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - // Don't really bother reading and comparing the contents here, - // We already verify the right digests are produced by comparing the - // directoryCb calls, and TestRegular ensures the reader works. - return mustBlobDigest(blobReader), nil - }, func(directory *castorev1pb.Directory) ([]byte, error) { - // use actualDirectoryOrder to look up the Directory object we expect at this specific invocation. - currentDirectoryPath := expectedDirectoryPaths[numDirectoriesReceived] - - expectedDirectory, found := expectedDirectories[currentDirectoryPath] - require.True(t, found, "must find the current directory") - - requireProtoEq(t, expectedDirectory, directory) - - numDirectoriesReceived += 1 - return mustDirectoryDigest(directory), nil - }, - ) - require.NoError(t, err) - require.Equal(t, &castorev1pb.Node{ - Node: &castorev1pb.Node_Directory{ - Directory: &castorev1pb.DirectoryNode{ - Name: []byte(""), - Digest: mustDirectoryDigest(expectedDirectories["/"]), - Size: expectedDirectories["/"].Size(), - }, - }, - }, rootNode) - require.Equal(t, []byte{ - 0xc6, 0xe1, 0x55, 0xb3, 0x45, 0x6e, 0x30, 0xb7, 0x61, 0x22, 0x63, 0xec, 0x09, 0x50, 0x70, 0x81, 0x1c, 0xaf, 0x8a, 0xbf, 0xd5, 0x9f, 0xaa, 0x72, 0xab, 0x82, 0xa5, 0x92, 0xef, 0xde, 0xb2, 0x53, - }, narSha256) - require.Equal(t, uint64(464152), narSize) -} - -// TestCallbackErrors ensures that errors returned from the callback function -// bubble up to the importer process, and are not ignored. -func TestCallbackErrors(t *testing.T) { - t.Run("callback blob", func(t *testing.T) { - // Pick an example NAR with a regular file. - f, err := os.Open("../../testdata/onebyteregular.nar") - require.NoError(t, err) - - targetErr := errors.New("expected error") - - _, _, _, err = importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - return nil, targetErr - }, func(directory *castorev1pb.Directory) ([]byte, error) { - panic("no directories expected!") - }, - ) - require.ErrorIs(t, err, targetErr) - }) - t.Run("callback directory", func(t *testing.T) { - // Pick an example NAR with a directory node - f, err := os.Open("../../testdata/emptydirectory.nar") - require.NoError(t, err) - - targetErr := errors.New("expected error") - - _, _, _, err = importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { - panic("no file contents expected!") - }, func(directory *castorev1pb.Directory) ([]byte, error) { - return nil, targetErr - }, - ) - require.ErrorIs(t, err, targetErr) - }) -} - -// TestPopDirectories is a regression test that ensures we handle the directory -// stack properly. -// -// This test case looks like: -// -// / (dir) -// /test (dir) -// /test/tested (file) -// /tested (file) -// -// We used to have a bug where the second `tested` file would appear as if -// it was in the `/test` dir because it has that dir as a string prefix. -func TestPopDirectories(t *testing.T) { - f, err := os.Open("../../testdata/popdirectories.nar") - require.NoError(t, err) - defer f.Close() - - _, _, _, err = importer.Import( - context.Background(), - f, - func(blobReader io.Reader) ([]byte, error) { return mustBlobDigest(blobReader), nil }, - func(directory *castorev1pb.Directory) ([]byte, error) { - require.NoError(t, directory.Validate(), "directory validation shouldn't error") - return mustDirectoryDigest(directory), nil - }, - ) - require.NoError(t, err) -} diff --git a/tvix/nar-bridge-go/pkg/importer/roundtrip_test.go b/tvix/nar-bridge-go/pkg/importer/roundtrip_test.go deleted file mode 100644 index c50d332d8..000000000 --- a/tvix/nar-bridge-go/pkg/importer/roundtrip_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package importer_test - -import ( - "bytes" - "context" - "encoding/base64" - "fmt" - "io" - "os" - "sync" - "testing" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - "code.tvl.fyi/tvix/nar-bridge-go/pkg/importer" - storev1pb "code.tvl.fyi/tvix/store-go" - "github.com/stretchr/testify/require" -) - -func TestRoundtrip(t *testing.T) { - // We pipe nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar to - // storev1pb.Export, and store all the file contents and directory objects - // received in two hashmaps. - // We then feed it to the writer, and test we come up with the same NAR file. - - f, err := os.Open("../../testdata/nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar") - require.NoError(t, err) - - narContents, err := io.ReadAll(f) - require.NoError(t, err) - - var mu sync.Mutex - blobsMap := make(map[string][]byte, 0) - directoriesMap := make(map[string]*castorev1pb.Directory) - - rootNode, _, _, err := importer.Import( - context.Background(), - bytes.NewBuffer(narContents), - func(blobReader io.Reader) ([]byte, error) { - // read in contents, we need to put it into filesMap later. - contents, err := io.ReadAll(blobReader) - require.NoError(t, err) - - dgst := mustBlobDigest(bytes.NewReader(contents)) - - // put it in filesMap - mu.Lock() - blobsMap[base64.StdEncoding.EncodeToString(dgst)] = contents - mu.Unlock() - - return dgst, nil - }, - func(directory *castorev1pb.Directory) ([]byte, error) { - dgst := mustDirectoryDigest(directory) - - directoriesMap[base64.StdEncoding.EncodeToString(dgst)] = directory - return dgst, nil - }, - ) - - require.NoError(t, err) - - // done populating everything, now actually test the export :-) - var narBuf bytes.Buffer - err = storev1pb.Export( - &narBuf, - rootNode, - func(directoryDgst []byte) (*castorev1pb.Directory, error) { - d, found := directoriesMap[base64.StdEncoding.EncodeToString(directoryDgst)] - if !found { - panic(fmt.Sprintf("directory %v not found", base64.StdEncoding.EncodeToString(directoryDgst))) - } - return d, nil - }, - func(blobDgst []byte) (io.ReadCloser, error) { - blobContents, found := blobsMap[base64.StdEncoding.EncodeToString(blobDgst)] - if !found { - panic(fmt.Sprintf("blob %v not found", base64.StdEncoding.EncodeToString(blobDgst))) - } - return io.NopCloser(bytes.NewReader(blobContents)), nil - }, - ) - - require.NoError(t, err, "exporter shouldn't fail") - require.Equal(t, narContents, narBuf.Bytes()) -} diff --git a/tvix/nar-bridge-go/pkg/importer/util_test.go b/tvix/nar-bridge-go/pkg/importer/util_test.go deleted file mode 100644 index 06353cf58..000000000 --- a/tvix/nar-bridge-go/pkg/importer/util_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package importer_test - -import ( - "io" - "testing" - - castorev1pb "code.tvl.fyi/tvix/castore-go" - "github.com/google/go-cmp/cmp" - "google.golang.org/protobuf/testing/protocmp" - "lukechampine.com/blake3" -) - -func requireProtoEq(t *testing.T, expected interface{}, actual interface{}) { - if diff := cmp.Diff(expected, actual, protocmp.Transform()); diff != "" { - t.Errorf("unexpected difference:\n%v", diff) - } -} - -func mustDirectoryDigest(d *castorev1pb.Directory) []byte { - dgst, err := d.Digest() - if err != nil { - panic(err) - } - return dgst -} - -func mustBlobDigest(r io.Reader) []byte { - hasher := blake3.New(32, nil) - _, err := io.Copy(hasher, r) - if err != nil { - panic(err) - } - return hasher.Sum([]byte{}) -} diff --git a/tvix/nar-bridge-go/testdata/emptydirectory.nar b/tvix/nar-bridge-go/testdata/emptydirectory.nar deleted file mode 100644 index baba55862255bf995b8721cb4117b2d08dbb9900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmd;OfPlQr3f;t_keEJ{r-$uFve K@?rWkp?m;VFABi` diff --git a/tvix/nar-bridge-go/testdata/nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar b/tvix/nar-bridge-go/testdata/nar_1094wph9z4nwlgvsd53abfz8i117ykiv5dwnq9nnhz846s7xqd7d.nar deleted file mode 100644 index 6cb0b16e5d5dfb4119fba98e9253ae5cf40c8c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464152 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

@aa6*ZRi1-XqX0GDSb`xQ{yA>29p<^ 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 U&VN7t)>YW3Bm)DXdWPQe0K-1oV*mgE diff --git a/tvix/nar-bridge-go/testdata/onebyteexecutable.nar b/tvix/nar-bridge-go/testdata/onebyteexecutable.nar deleted file mode 100644 index 68682196665c95eea2f2c3cb8fa777944e969d3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmd;OfPlQr3f;t_45PlS@kylXAeSpn?nx3>;8qa(-S(YFcMmiedWEX-%j)0H@&%Q~&?~ diff --git a/tvix/nar-bridge-go/testdata/popdirectories.nar b/tvix/nar-bridge-go/testdata/popdirectories.nar deleted file mode 100644 index 74313aca529f6515b3284e9ef30f9542ceb7588a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmd;OfPlQr3f;t_keEJ{r-$uFve z@>!vDYF-Ig43{~1iMe2N;O3?lmw>dw_<8v$V0m2nsqGFnkmU>v3?-?>C8;S44AgQ5 R%>9~B^GW5C8lHp29{|jYH4^{; diff --git a/tvix/nar-bridge-go/testdata/symlink.nar b/tvix/nar-bridge-go/testdata/symlink.nar deleted file mode 100644 index 7990e4ad5bc27fd2ca9a2a9a284fb7c5b2995027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmd;OfPlQr3f;t_