internal/rosa: access backing storage through fs
Test / Create distribution (push) Successful in 52s
Test / Sandbox (push) Successful in 2m44s
Test / Hakurei (push) Successful in 3m52s
Test / ShareFS (push) Successful in 3m53s
Test / Sandbox (race detector) (push) Successful in 5m32s
Test / Hakurei (race detector) (push) Successful in 6m30s
Test / Flake checks (push) Successful in 1m7s
Test / Create distribution (push) Successful in 52s
Test / Sandbox (push) Successful in 2m44s
Test / Hakurei (push) Successful in 3m52s
Test / ShareFS (push) Successful in 3m53s
Test / Sandbox (race detector) (push) Successful in 5m32s
Test / Hakurei (race detector) (push) Successful in 6m30s
Test / Flake checks (push) Successful in 1m7s
This is more versatile than hardcoding the os.Root implementation. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
+1
-1
@@ -522,7 +522,7 @@ func main() {
|
|||||||
if base, err := os.OpenRoot(cm.base); err != nil {
|
if base, err := os.OpenRoot(cm.base); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
h = rosa.NewMirror(msg, base, key)
|
h = rosa.NewMirror(msg, base.FS(), key)
|
||||||
}
|
}
|
||||||
|
|
||||||
server := http.Server{Addr: args[0], Handler: h}
|
server := http.Server{Addr: args[0], Handler: h}
|
||||||
|
|||||||
+14
-8
@@ -204,7 +204,7 @@ func (r Remote) Status(
|
|||||||
// NewMirror returns an [http.Handler] for servicing mirror requests.
|
// NewMirror returns an [http.Handler] for servicing mirror requests.
|
||||||
func NewMirror(
|
func NewMirror(
|
||||||
msg message.Msg,
|
msg message.Msg,
|
||||||
base *os.Root,
|
fsys fs.FS,
|
||||||
key ed25519.PrivateKey,
|
key ed25519.PrivateKey,
|
||||||
) http.Handler {
|
) http.Handler {
|
||||||
const identName = "ident"
|
const identName = "ident"
|
||||||
@@ -224,7 +224,7 @@ func NewMirror(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ids := pkg.Encode((pkg.Checksum)(buf[:len(pkg.Checksum{})]))
|
ids := pkg.Encode((pkg.Checksum)(buf[:len(pkg.Checksum{})]))
|
||||||
if linkname, err := base.Readlink(filepath.Join(
|
if linkname, err := fs.ReadLink(fsys, filepath.Join(
|
||||||
"identifier",
|
"identifier",
|
||||||
ids,
|
ids,
|
||||||
)); err != nil {
|
)); err != nil {
|
||||||
@@ -239,7 +239,7 @@ func NewMirror(
|
|||||||
(*pkg.Checksum)(buf[len(pkg.Checksum{}):]),
|
(*pkg.Checksum)(buf[len(pkg.Checksum{}):]),
|
||||||
filepath.Base(linkname),
|
filepath.Base(linkname),
|
||||||
); err != nil {
|
); err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusBadRequest)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
msg.Verbosef("serving artifact %s", ids)
|
msg.Verbosef("serving artifact %s", ids)
|
||||||
@@ -276,7 +276,7 @@ func NewMirror(
|
|||||||
|
|
||||||
checksums := pkg.Encode(buf)
|
checksums := pkg.Encode(buf)
|
||||||
rel := filepath.Join("checksum", checksums)
|
rel := filepath.Join("checksum", checksums)
|
||||||
if _, err := base.Lstat(rel); err != nil {
|
if _, err := fs.Lstat(fsys, rel); err != nil {
|
||||||
if errors.Is(err, os.ErrNotExist) {
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
w.WriteHeader(http.StatusNotFound)
|
w.WriteHeader(http.StatusNotFound)
|
||||||
return
|
return
|
||||||
@@ -287,7 +287,7 @@ func NewMirror(
|
|||||||
}
|
}
|
||||||
msg.Verbosef("serving outcome %s", pkg.Encode(buf))
|
msg.Verbosef("serving outcome %s", pkg.Encode(buf))
|
||||||
|
|
||||||
fsys, err := fs.Sub(base.FS(), rel)
|
_fsys, err := fs.Sub(fsys, rel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg.GetLogger().Println(err)
|
msg.GetLogger().Println(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
@@ -301,7 +301,7 @@ func NewMirror(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Header().Set("Content-Encoding", "gzip")
|
w.Header().Set("Content-Encoding", "gzip")
|
||||||
if err = pkg.Write(fsys, ".", gw); err != nil {
|
if err = pkg.Write(_fsys, ".", gw); err != nil {
|
||||||
msg.Verbose(err)
|
msg.Verbose(err)
|
||||||
}
|
}
|
||||||
if err = gw.Close(); err != nil {
|
if err = gw.Close(); err != nil {
|
||||||
@@ -323,7 +323,7 @@ func NewMirror(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ids := pkg.Encode((pkg.Checksum)(buf[:len(pkg.Checksum{})]))
|
ids := pkg.Encode((pkg.Checksum)(buf[:len(pkg.Checksum{})]))
|
||||||
f, err := base.Open(filepath.Join(
|
f, err := fsys.Open(filepath.Join(
|
||||||
"status",
|
"status",
|
||||||
ids,
|
ids,
|
||||||
))
|
))
|
||||||
@@ -336,6 +336,12 @@ func NewMirror(
|
|||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
s, ok := f.(io.Seeker)
|
||||||
|
if !ok {
|
||||||
|
msg.GetLogger().Println("backing filesystem does not support seek")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
msg.Verbosef("serving status %s", ids)
|
msg.Verbosef("serving status %s", ids)
|
||||||
|
|
||||||
h := sha512.New384()
|
h := sha512.New384()
|
||||||
@@ -348,7 +354,7 @@ func NewMirror(
|
|||||||
if _, err = w.Write(append(ed25519.Sign(key, buf[:]), buf[:]...)); err != nil {
|
if _, err = w.Write(append(ed25519.Sign(key, buf[:]), buf[:]...)); err != nil {
|
||||||
msg.Verbose(err)
|
msg.Verbose(err)
|
||||||
return
|
return
|
||||||
} else if _, err = f.Seek(0, io.SeekStart); err != nil {
|
} else if _, err = s.Seek(0, io.SeekStart); err != nil {
|
||||||
msg.GetLogger().Println(err)
|
msg.GetLogger().Println(err)
|
||||||
return
|
return
|
||||||
} else if _, err = io.Copy(w, f); err != nil {
|
} else if _, err = io.Copy(w, f); err != nil {
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package rosa_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/ed25519"
|
||||||
|
"io/fs"
|
||||||
|
"log"
|
||||||
|
"net/http/httptest"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
"testing/fstest"
|
||||||
|
"unique"
|
||||||
|
|
||||||
|
"hakurei.app/check"
|
||||||
|
"hakurei.app/fhs"
|
||||||
|
"hakurei.app/internal/pkg"
|
||||||
|
"hakurei.app/internal/rosa"
|
||||||
|
"hakurei.app/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMirror(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
pub, priv, err := ed25519.GenerateKey(nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
base := check.MustAbs(t.TempDir())
|
||||||
|
msg := message.New(log.New(os.Stderr, "mirror: ", 0))
|
||||||
|
msg.SwapVerbose(testing.Verbose())
|
||||||
|
|
||||||
|
var c *pkg.Cache
|
||||||
|
c, err = pkg.Open(t.Context(), msg, 0, 0, 0, base)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
t.Cleanup(c.Close)
|
||||||
|
|
||||||
|
a := pkg.NewExec(
|
||||||
|
"", "",
|
||||||
|
nil, 0, false, false,
|
||||||
|
fhs.AbsRoot, nil, fhs.AbsRoot, nil,
|
||||||
|
)
|
||||||
|
id := c.Ident(a)
|
||||||
|
ids := pkg.Encode(id.Value())
|
||||||
|
|
||||||
|
var wantChecksum pkg.Checksum
|
||||||
|
if err = pkg.SumFS(&wantChecksum, fstest.MapFS{
|
||||||
|
".": {Mode: os.ModeDir | 0500},
|
||||||
|
}, "."); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
wantChecksums := pkg.Encode(wantChecksum)
|
||||||
|
|
||||||
|
server := httptest.NewServer(rosa.NewMirror(msg, fstest.MapFS{
|
||||||
|
"identifier/" + ids: {Mode: fs.ModeSymlink | 0777, Data: []byte("../checksum/" + wantChecksums)},
|
||||||
|
"checksum/" + wantChecksums: {Mode: os.ModeDir | 0500},
|
||||||
|
}, priv))
|
||||||
|
t.Cleanup(server.Close)
|
||||||
|
|
||||||
|
var extern pkg.External
|
||||||
|
extern, err = rosa.NewRemote("http://example.com:80", pub, server.Client())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
c.SetExternal(extern)
|
||||||
|
|
||||||
|
var got unique.Handle[pkg.Checksum]
|
||||||
|
if _, got, err = c.Cure(a); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
} else if got.Value() != wantChecksum {
|
||||||
|
t.Logf(
|
||||||
|
"Cure: checksum = %s, want %s",
|
||||||
|
pkg.Encode(got.Value()), pkg.Encode(wantChecksum),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user