Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 40 additions & 9 deletions ociutils/oci/image.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,23 @@
RootFS *FileLayer
InitRAMFs *FileLayer
Kernel *FileLayer
SquashFS *FileLayer
}

type FileLayer struct {
Descriptor ocispecv1.Descriptor
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
Expand All @@ -45,6 +55,8 @@

pullRequests chan pullRequest
listeners []Listener

required sets.Set[Layer]
}

type pullRequest struct {
Expand Down Expand Up @@ -121,18 +133,29 @@
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)
Expand Down Expand Up @@ -267,6 +290,7 @@
ironcoreimage.InitRAMFSLayerMediaType: "layer",
ironcoreimage.KernelLayerMediaType: "layer",
ironcoreimage.RootFSLayerMediaType: "layer",
ironcoreimage.SquashFSLayerMediaType: "layer",
}
for mediaType, prefix := range mediaTypeToPrefix {
ctx = remotes.WithMediaTypeKeyPrefix(ctx, mediaType, prefix)
Expand Down Expand Up @@ -296,12 +320,19 @@
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) {

Check failure on line 323 in ociutils/oci/image.go

View workflow job for this annotation

GitHub Actions / lint

The line is 131 characters long, which exceeds the maximum of 120 characters. (lll)
if required == nil || len(required) == 0 {

Check failure on line 324 in ociutils/oci/image.go

View workflow job for this annotation

GitHub Actions / lint

S1009: should omit nil check; len() for nil maps is defined as zero (staticcheck)
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
}

Expand Down
Loading