diff --git a/ociutils/oci/image.go b/ociutils/oci/image.go index 1ae75ba..7f2c966 100644 --- a/ociutils/oci/image.go +++ b/ociutils/oci/image.go @@ -27,6 +27,7 @@ type Image struct { RootFS *FileLayer InitRAMFs *FileLayer Kernel *FileLayer + SquashFS *FileLayer } type FileLayer struct { @@ -34,6 +35,15 @@ type FileLayer struct { Path string } +type Layer string + +var ( + RootFSLayer Layer = "rootfs" + KernelLayer Layer = "kernel" + SquashFSLayer Layer = "squashfs" + InitRAMFsLayer Layer = "initramfs" +) + type LocalCache struct { mu sync.Mutex running bool @@ -45,6 +55,8 @@ type LocalCache struct { pullRequests chan pullRequest listeners []Listener + + required sets.Set[Layer] } type pullRequest struct { @@ -121,18 +133,29 @@ func (c *LocalCache) resolveImage(ctx context.Context, ociImg image.Image) (*Ima Descriptor: layer.Descriptor(), Path: rootFSPath, } - + case ironcoreimage.SquashFSLayerMediaType: + squashFSPath, err := localStore.BlobPath(layer.Descriptor().Digest) + if err != nil { + return nil, fmt.Errorf("error getting path to squash: %w", err) + } + img.RootFS = &FileLayer{ + Descriptor: layer.Descriptor(), + Path: squashFSPath, + } } } - var missing []string - if img.RootFS == nil || img.RootFS.Path == "" { - missing = append(missing, "rootfs") + var missing []Layer + if c.required.Has(RootFSLayer) && (img.RootFS == nil || img.RootFS.Path == "") { + missing = append(missing, RootFSLayer) } - if img.Kernel == nil || img.Kernel.Path == "" { - missing = append(missing, "kernel") + if c.required.Has(KernelLayer) && (img.Kernel == nil || img.Kernel.Path == "") { + missing = append(missing, KernelLayer) } - if img.InitRAMFs == nil || img.InitRAMFs.Path == "" { - missing = append(missing, "initramfs") + if c.required.Has(SquashFSLayer) && (img.SquashFS == nil || img.SquashFS.Path == "") { + missing = append(missing, SquashFSLayer) + } + if c.required.Has(InitRAMFsLayer) && (img.InitRAMFs == nil || img.InitRAMFs.Path == "") { + missing = append(missing, InitRAMFsLayer) } if len(missing) > 0 { return nil, fmt.Errorf("incomplete oci: components are missing: %v", missing) @@ -267,6 +290,7 @@ func setupMediaTypeKeyPrefixes(ctx context.Context) context.Context { ironcoreimage.InitRAMFSLayerMediaType: "layer", ironcoreimage.KernelLayerMediaType: "layer", ironcoreimage.RootFSLayerMediaType: "layer", + ironcoreimage.SquashFSLayerMediaType: "layer", } for mediaType, prefix := range mediaTypeToPrefix { ctx = remotes.WithMediaTypeKeyPrefix(ctx, mediaType, prefix) @@ -296,12 +320,19 @@ func (c *LocalCache) Start(ctx context.Context) error { return nil } -func NewLocalCache(log logr.Logger, registry *remote.Registry, store *store.Store) (*LocalCache, error) { +func NewLocalCache(log logr.Logger, registry *remote.Registry, store *store.Store, required sets.Set[Layer]) (*LocalCache, error) { + if required == nil || len(required) == 0 { + log.V(0).Info("No layers required, set rootfs as default") + required = sets.Set[Layer]{} + required.Insert(RootFSLayer) + } + return &LocalCache{ log: log, store: store, registry: registry, pullRequests: make(chan pullRequest), + required: required, }, nil }