blob: 694476e215721f23f64ed29a4a14beeaa68e3c88 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Lorenz Brun901c7322023-07-13 20:10:37 +02004// Package localregistry implements a read-only OCI Distribution / Docker
5// V2 container image registry backed by local layers.
6package localregistry
7
8import (
Lorenz Brun901c7322023-07-13 20:10:37 +02009 "fmt"
Jan Schär9d2f3c62025-04-14 11:17:22 +000010 "path"
Lorenz Brun901c7322023-07-13 20:10:37 +020011
Serge Bazanskif779b8f2024-04-17 16:30:55 +020012 "github.com/bazelbuild/rules_go/go/runfiles"
Lorenz Brun901c7322023-07-13 20:10:37 +020013 "google.golang.org/protobuf/encoding/prototext"
14
Tim Windelschmidt9f21f532024-05-07 15:14:20 +020015 "source.monogon.dev/metropolis/test/localregistry/spec"
Jan Schär9d2f3c62025-04-14 11:17:22 +000016 "source.monogon.dev/osbase/oci"
17 "source.monogon.dev/osbase/oci/registry"
Lorenz Brun901c7322023-07-13 20:10:37 +020018)
19
Jan Schär9d2f3c62025-04-14 11:17:22 +000020func FromBazelManifest(mb []byte) (*registry.Server, error) {
Tim Windelschmidt0974b222024-01-16 14:04:15 +010021 var bazelManifest spec.Manifest
22 if err := prototext.Unmarshal(mb, &bazelManifest); err != nil {
Jan Schär9d2f3c62025-04-14 11:17:22 +000023 return nil, fmt.Errorf("failed to parse manifest: %w", err)
Lorenz Brun901c7322023-07-13 20:10:37 +020024 }
Jan Schär9d2f3c62025-04-14 11:17:22 +000025 s := registry.NewServer()
Tim Windelschmidt0974b222024-01-16 14:04:15 +010026 for _, i := range bazelManifest.Images {
Jan Schär9d2f3c62025-04-14 11:17:22 +000027 resolvedPath, err := runfiles.Rlocation(path.Join("_main", i.Path))
Lorenz Brun901c7322023-07-13 20:10:37 +020028 if err != nil {
Jan Schär9d2f3c62025-04-14 11:17:22 +000029 return nil, fmt.Errorf("failed to resolve image path %q: %w", i.Path, err)
Lorenz Brun901c7322023-07-13 20:10:37 +020030 }
Jan Schär9d2f3c62025-04-14 11:17:22 +000031 image, err := oci.ReadLayout(resolvedPath)
Lorenz Brun901c7322023-07-13 20:10:37 +020032 if err != nil {
Jan Schär9d2f3c62025-04-14 11:17:22 +000033 return nil, fmt.Errorf("failed to read image from %q: %w", i.Path, err)
Lorenz Brun901c7322023-07-13 20:10:37 +020034 }
Jan Schär9d2f3c62025-04-14 11:17:22 +000035 err = s.AddImage(i.Repository, i.Tag, image)
36 if err != nil {
37 return nil, fmt.Errorf("failed to add image: %w", err)
Tim Windelschmidt0974b222024-01-16 14:04:15 +010038 }
Lorenz Brun901c7322023-07-13 20:10:37 +020039 }
Jan Schär9d2f3c62025-04-14 11:17:22 +000040 return s, nil
Lorenz Brun901c7322023-07-13 20:10:37 +020041}