in tooling/mcerepkg/internal/olm/extract.go [40:94]
func ExtractOLMBundleImage(_ context.Context, image containerregistrypkgv1.Image) (
objects []unstructured.Unstructured, reg convert.RegistryV1, err error,
) {
rawFS := fstest.MapFS{}
reader := mutate.Extract(image)
defer func() {
if cErr := reader.Close(); err == nil && cErr != nil {
err = cErr
}
}()
tarReader := tar.NewReader(reader)
for {
hdr, err := tarReader.Next()
if err != nil && errors.Is(err, io.EOF) {
break
}
path := hdr.Name
if strings.HasPrefix(path, "../") {
continue
}
if hdr.Typeflag == tar.TypeDir {
continue
}
data, err := io.ReadAll(tarReader)
if err != nil {
return nil, reg, fmt.Errorf("read file header from layer: %w", err)
}
rawFS[path] = &fstest.MapFile{
Data: data,
}
}
if len(rawFS) == 0 {
return nil, reg, fmt.Errorf("package image contains no files. Might be corrupted")
}
convertedFS, reg, err := convert.RegistryV1ToPlain(rawFS, "", nil)
if err != nil {
return nil, reg, fmt.Errorf("converting OLM Bundle to static manifests: %w", err)
}
manifestBytes, err := fs.ReadFile(convertedFS, convertedManifestFile)
if err != nil {
return nil, reg, fmt.Errorf("reading converted manifests: %w", err)
}
objects, err = kubemanifests.LoadKubernetesObjectsFromBytes(manifestBytes)
if err != nil {
return nil, reg, fmt.Errorf("loading objects from manifests: %w", err)
}
return objects, reg, nil
}