| Tim Windelschmidt | 6d33a43 | 2025-02-04 14:34:25 +0100 | [diff] [blame] | 1 | // Copyright The Monogon Project Authors. |
| 2 | // SPDX-License-Identifier: Apache-2.0 |
| 3 | |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 4 | // Package localregistry implements a read-only OCI Distribution / Docker |
| 5 | // V2 container image registry backed by local layers. |
| 6 | package localregistry |
| 7 | |
| 8 | import ( |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 9 | "fmt" |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 10 | "path" |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 11 | |
| Serge Bazanski | f779b8f | 2024-04-17 16:30:55 +0200 | [diff] [blame] | 12 | "github.com/bazelbuild/rules_go/go/runfiles" |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 13 | "google.golang.org/protobuf/encoding/prototext" |
| 14 | |
| Tim Windelschmidt | 9f21f53 | 2024-05-07 15:14:20 +0200 | [diff] [blame] | 15 | "source.monogon.dev/metropolis/test/localregistry/spec" |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 16 | "source.monogon.dev/osbase/oci" |
| 17 | "source.monogon.dev/osbase/oci/registry" |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 18 | ) |
| 19 | |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 20 | func FromBazelManifest(mb []byte) (*registry.Server, error) { |
| Tim Windelschmidt | 0974b22 | 2024-01-16 14:04:15 +0100 | [diff] [blame] | 21 | var bazelManifest spec.Manifest |
| 22 | if err := prototext.Unmarshal(mb, &bazelManifest); err != nil { |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 23 | return nil, fmt.Errorf("failed to parse manifest: %w", err) |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 24 | } |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 25 | s := registry.NewServer() |
| Tim Windelschmidt | 0974b22 | 2024-01-16 14:04:15 +0100 | [diff] [blame] | 26 | for _, i := range bazelManifest.Images { |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 27 | resolvedPath, err := runfiles.Rlocation(path.Join("_main", i.Path)) |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 28 | if err != nil { |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 29 | return nil, fmt.Errorf("failed to resolve image path %q: %w", i.Path, err) |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 30 | } |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 31 | image, err := oci.ReadLayout(resolvedPath) |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 32 | if err != nil { |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 33 | return nil, fmt.Errorf("failed to read image from %q: %w", i.Path, err) |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 34 | } |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 35 | err = s.AddImage(i.Repository, i.Tag, image) |
| 36 | if err != nil { |
| 37 | return nil, fmt.Errorf("failed to add image: %w", err) |
| Tim Windelschmidt | 0974b22 | 2024-01-16 14:04:15 +0100 | [diff] [blame] | 38 | } |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 39 | } |
| Jan Schär | 9d2f3c6 | 2025-04-14 11:17:22 +0000 | [diff] [blame^] | 40 | return s, nil |
| Lorenz Brun | 901c732 | 2023-07-13 20:10:37 +0200 | [diff] [blame] | 41 | } |