build: cleanup error names and other things

This commit is contained in:
Blake Mizerany 2024-04-01 21:57:34 -07:00
parent 876f7eab81
commit b1b8be33d9
3 changed files with 27 additions and 30 deletions

View File

@ -55,7 +55,7 @@ func (s *Server) handlePush(_ http.ResponseWriter, r *http.Request) error {
const registryURLTODO = "http://localhost:8888" const registryURLTODO = "http://localhost:8888"
man, err := s.Build.Manifest(params.Name) man, err := s.Build.ManifestData(params.Name)
if err != nil { if err != nil {
if errors.Is(err, build.ErrNotFound) { if errors.Is(err, build.ErrNotFound) {
return errRefNotFound return errRefNotFound

View File

@ -15,13 +15,10 @@ import (
// Errors // Errors
var ( var (
ErrRefUnqualified = errors.New("unqualified ref") ErrIncompleteRef = errors.New("unqualified ref")
ErrRefBuildPresent = errors.New("ref too long")
ErrUnsupportedModelFormat = errors.New("unsupported model format") ErrUnsupportedModelFormat = errors.New("unsupported model format")
ErrMissingFileType = errors.New("missing 'general.file_type' key") ErrMissingFileType = errors.New("missing 'general.file_type' key")
ErrNoSuchBlob = errors.New("no such blob")
ErrNotFound = errors.New("not found") ErrNotFound = errors.New("not found")
ErrUnknownRef = errors.New("unknown ref")
) )
type mediaType string type mediaType string
@ -57,7 +54,7 @@ func Open(dir string) (*Server, error) {
func (s *Server) Build(ref string, f model.File) error { func (s *Server) Build(ref string, f model.File) error {
br := blob.ParseRef(ref) br := blob.ParseRef(ref)
if !br.Complete() { if !br.Complete() {
return fmt.Errorf("%w: %q", ErrRefUnqualified, br.Full()) return fmt.Errorf("%w: %q", ErrIncompleteRef, br.Full())
} }
// 1. Resolve FROM // 1. Resolve FROM
@ -94,7 +91,7 @@ func (s *Server) Build(ref string, f model.File) error {
Size: size, Size: size,
}) })
data, err := json.Marshal(manifestJSON{Layers: layers}) data, err := json.Marshal(Manifest{Layers: layers})
if err != nil { if err != nil {
return err return err
} }
@ -105,23 +102,31 @@ func (s *Server) LayerFile(digest string) (string, error) {
fileName := s.st.OutputFilename(blobstore.ParseID(digest)) fileName := s.st.OutputFilename(blobstore.ParseID(digest))
_, err := os.Stat(fileName) _, err := os.Stat(fileName)
if errors.Is(err, fs.ErrNotExist) { if errors.Is(err, fs.ErrNotExist) {
return "", fmt.Errorf("%w: %q", ErrNoSuchBlob, digest) return "", fmt.Errorf("%w: %q", ErrNotFound, digest)
} }
return fileName, nil return fileName, nil
} }
func (s *Server) Manifest(ref string) ([]byte, error) { func (s *Server) Manifest(ref string) (Manifest, error) {
br, err := parseFullRef(ref) br, err := parseCompleteRef(ref)
if err != nil {
return Manifest{}, err
}
return s.getManifest(br)
}
func (s *Server) ManifestData(ref string) ([]byte, error) {
br, err := parseCompleteRef(ref)
if err != nil { if err != nil {
return nil, err return nil, err
} }
data, _, err := s.getManifestData(br) data, _, err := s.resolve(br)
return data, err return data, err
} }
// WeightFile returns the absolute path to the weights file for the given model ref. // WeightFile returns the absolute path to the weights file for the given model ref.
func (s *Server) WeightsFile(ref string) (string, error) { func (s *Server) WeightsFile(ref string) (string, error) {
br, err := parseFullRef(ref) br, err := parseCompleteRef(ref)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -153,7 +158,7 @@ func (s *Server) resolve(ref blob.Ref) (data []byte, path string, err error) {
} }
data, err = os.ReadFile(path) data, err = os.ReadFile(path)
if errors.Is(err, fs.ErrNotExist) { if errors.Is(err, fs.ErrNotExist) {
return nil, "", fmt.Errorf("%w: %q", ErrUnknownRef, ref) return nil, "", fmt.Errorf("%w: %q", ErrNotFound, ref)
} }
if err != nil { if err != nil {
// do not wrap the error here, as it is likely an I/O error // do not wrap the error here, as it is likely an I/O error
@ -186,7 +191,7 @@ func (s *Server) refFileName(ref blob.Ref) (string, error) {
return filepath.Join(s.st.Dir(), "manifests", filepath.Join(ref.Parts()...)), nil return filepath.Join(s.st.Dir(), "manifests", filepath.Join(ref.Parts()...)), nil
} }
type manifestJSON struct { type Manifest struct {
// Layers is the list of layers in the manifest. // Layers is the list of layers in the manifest.
Layers []layerJSON `json:"layers"` Layers []layerJSON `json:"layers"`
} }
@ -199,30 +204,22 @@ type layerJSON struct {
Size int64 `json:"size"` Size int64 `json:"size"`
} }
func (s *Server) getManifest(ref blob.Ref) (manifestJSON, error) { func (s *Server) getManifest(ref blob.Ref) (Manifest, error) {
data, path, err := s.getManifestData(ref) data, path, err := s.resolve(ref)
if err != nil { if err != nil {
return manifestJSON{}, err return Manifest{}, err
} }
var m manifestJSON var m Manifest
if err := json.Unmarshal(data, &m); err != nil { if err := json.Unmarshal(data, &m); err != nil {
return manifestJSON{}, &fs.PathError{Op: "unmarshal", Path: path, Err: err} return Manifest{}, &fs.PathError{Op: "unmarshal", Path: path, Err: err}
} }
return m, nil return m, nil
} }
func (s *Server) getManifestData(ref blob.Ref) (data []byte, path string, err error) { func parseCompleteRef(ref string) (blob.Ref, error) {
data, path, err = s.resolve(ref)
if errors.Is(err, ErrUnknownRef) {
return nil, "", fmt.Errorf("%w: %q", ErrNotFound, ref)
}
return data, path, err
}
func parseFullRef(ref string) (blob.Ref, error) {
br := blob.ParseRef(ref) br := blob.ParseRef(ref)
if !br.Complete() { if !br.Complete() {
return blob.Ref{}, fmt.Errorf("%w: %q", ErrRefUnqualified, ref) return blob.Ref{}, fmt.Errorf("%w: %q", ErrIncompleteRef, ref)
} }
return br, nil return br, nil
} }

View File

@ -22,7 +22,7 @@ func TestServerBuildErrors(t *testing.T) {
t.Run("unqualified ref", func(t *testing.T) { t.Run("unqualified ref", func(t *testing.T) {
err := s.Build("x", model.File{}) err := s.Build("x", model.File{})
if !errors.Is(err, ErrRefUnqualified) { if !errors.Is(err, ErrIncompleteRef) {
t.Fatalf("Build() err = %v; want unqualified ref", err) t.Fatalf("Build() err = %v; want unqualified ref", err)
} }
}) })