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_5|HVR1lLB%1_BGN=+`wFRFy{Vfr+o Fd;nH23c&yX 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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 z 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

cg=Lc6W)mK&uuQSr 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

0hGn==~l@)*sz!t1m)|TNmhOmE&iXlU`CXZQoxr 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 M|L#BZ@4o;40mDApV*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_5|HVR1lLL$}dVyFU?6TV&H=EQ!7%F hOG^@ya=@yff5|HVR1lLL$}dVyFU?6TV&H)Clk@XR PQu9iRVfxW&O{h8mr{N7$ 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_5|HVR1lLB%1_BGN=+`wFRFy{S)p`l zUI|zXmpOTfxnOhP=B5^xfV9H+dHE?|d0hIb?G84myGwxXNKK)hJ7DhDgqlw(pVaUi HEdBrh%!@S> 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_5|HVR1lLL$}g_W&B@HmW?+NKCl;lr nmM}0#K>7MWgY}C`@{3aSi}Q0+%QI4oQd4t^Q(@+7Le&8PV!9R=