@@ -14,76 +14,16 @@ import (
1414 "path/filepath"
1515 "strings"
1616
17- "github.com/google/go-containerregistry/pkg/crane"
1817 "github.com/google/go-containerregistry/pkg/name"
19- v1 "github.com/google/go-containerregistry/pkg/v1"
20- "github.com/google/go-containerregistry/pkg/v1/empty"
21- "github.com/google/go-containerregistry/pkg/v1/layout"
2218 "github.com/siderolabs/talos/pkg/machinery/imager/quirks"
2319 "go.uber.org/zap"
24- "golang.org/x/sync/errgroup"
2520
21+ "github.com/siderolabs/image-factory/internal/artifacts/imagehandler"
2622 "github.com/siderolabs/image-factory/internal/image/verify"
2723)
2824
29- type imageHandler func (ctx context.Context , logger * zap.Logger , img v1.Image ) error
30-
31- // imageExportHandler exports the image for further processing.
32- func imageExportHandler (exportHandler func (logger * zap.Logger , r io.Reader ) error ) imageHandler {
33- return func (_ context.Context , logger * zap.Logger , img v1.Image ) error {
34- logger .Info ("extracting the image" )
35-
36- r , w := io .Pipe ()
37-
38- var eg errgroup.Group
39-
40- eg .Go (func () error {
41- defer w .Close () //nolint:errcheck
42-
43- return crane .Export (img , w )
44- })
45-
46- eg .Go (func () error {
47- err := exportHandler (logger , r )
48- if err != nil {
49- r .CloseWithError (err ) // signal the exporter to stop
50- }
51-
52- return err
53- })
54-
55- if err := eg .Wait (); err != nil {
56- return fmt .Errorf ("error extracting the image: %w" , err )
57- }
58-
59- return nil
60- }
61- }
62-
63- // imageOCIHandler exports the image to the OCI format.
64- func imageOCIHandler (path string ) imageHandler {
65- return func (_ context.Context , logger * zap.Logger , img v1.Image ) error {
66- if err := os .RemoveAll (path ); err != nil {
67- return fmt .Errorf ("error removing the directory %q: %w" , path , err )
68- }
69-
70- l , err := layout .Write (path , empty .Index )
71- if err != nil {
72- return fmt .Errorf ("error creating layout: %w" , err )
73- }
74-
75- logger .Info ("exporting the image" , zap .String ("destination" , path ))
76-
77- if err = l .AppendImage (img ); err != nil {
78- return fmt .Errorf ("error exporting the image: %w" , err )
79- }
80-
81- return nil
82- }
83- }
84-
8525// fetchImageByTag contains combined logic of image handling: heading, downloading, verifying signatures, and exporting.
86- func (m * Manager ) fetchImageByTag (imageName , tag string , architecture Arch , imageHandler imageHandler ) error {
26+ func (m * Manager ) fetchImageByTag (imageName , tag string , architecture Arch , imageHandler imagehandler. Handler ) error {
8727 // set a timeout for fetching, but don't bind it to any context, as we want fetch operation to finish
8828 ctx , cancel := context .WithTimeout (context .Background (), FetchTimeout )
8929 defer cancel ()
@@ -105,7 +45,7 @@ func (m *Manager) fetchImageByTag(imageName, tag string, architecture Arch, imag
10545}
10646
10747// fetchImageByDigest fetches an image by digest, verifies signatures, and exports it to the storage.
108- func (m * Manager ) fetchImageByDigest (digestRef name.Digest , architecture Arch , imageHandler imageHandler ) error {
48+ func (m * Manager ) fetchImageByDigest (digestRef name.Digest , architecture Arch , imageHandler imagehandler. Handler ) error {
10949 var err error
11050 // set a timeout for fetching, but don't bind it to any context, as we want fetch operation to finish
11151 ctx , cancel := context .WithTimeout (context .Background (), FetchTimeout )
@@ -149,7 +89,7 @@ func (m *Manager) fetchImageByDigest(digestRef name.Digest, architecture Arch, i
14989func (m * Manager ) fetchImager (tag string ) error {
15090 destinationPath := filepath .Join (m .storagePath , tag )
15191
152- if err := m .fetchImageByTag (m .options .ImagerImage , tag , ArchAmd64 , imageExportHandler (func (logger * zap.Logger , r io.Reader ) error {
92+ if err := m .fetchImageByTag (m .options .ImagerImage , tag , ArchAmd64 , imagehandler . Export (func (logger * zap.Logger , r io.Reader ) error {
15393 return untarWithPrefix (logger , r , usrInstallPrefix , destinationPath + tmpSuffix )
15494 })); err != nil {
15595 return err
@@ -164,7 +104,7 @@ func (m *Manager) extractOverlay(arch Arch, ref OverlayRef) error {
164104
165105 destinationPath := filepath .Join (m .storagePath , string (arch )+ "-" + ref .Digest + "-overlay" )
166106
167- if err := m .fetchImageByDigest (imageRef , arch , imageExportHandler (func (logger * zap.Logger , r io.Reader ) error {
107+ if err := m .fetchImageByDigest (imageRef , arch , imagehandler . Export (func (logger * zap.Logger , r io.Reader ) error {
168108 return untarWithPrefix (logger , r , overlaysPrefix , destinationPath + tmpSuffix )
169109 })); err != nil {
170110 return err
@@ -177,7 +117,7 @@ func (m *Manager) extractOverlay(arch Arch, ref OverlayRef) error {
177117func (m * Manager ) fetchExtensionImage (arch Arch , ref ExtensionRef , destPath string ) error {
178118 imageRef := ref .TaggedReference .Digest (ref .Digest )
179119
180- if err := m .fetchImageByDigest (imageRef , arch , imageOCIHandler (destPath + tmpSuffix )); err != nil {
120+ if err := m .fetchImageByDigest (imageRef , arch , imagehandler . OCI (destPath + tmpSuffix )); err != nil {
181121 return err
182122 }
183123
@@ -188,7 +128,7 @@ func (m *Manager) fetchExtensionImage(arch Arch, ref ExtensionRef, destPath stri
188128func (m * Manager ) fetchOverlayImage (arch Arch , ref OverlayRef , destPath string ) error {
189129 imageRef := m .imageRegistry .Repo (ref .TaggedReference .RepositoryStr ()).Digest (ref .Digest )
190130
191- if err := m .fetchImageByDigest (imageRef , arch , imageOCIHandler (destPath + tmpSuffix )); err != nil {
131+ if err := m .fetchImageByDigest (imageRef , arch , imagehandler . OCI (destPath + tmpSuffix )); err != nil {
192132 return err
193133 }
194134
@@ -206,7 +146,7 @@ func (m *Manager) InstallerImageName(versionTag string) string {
206146
207147// fetchInstallerImage fetches a Talos installer image and exports it to the storage.
208148func (m * Manager ) fetchInstallerImage (arch Arch , versionTag string , destPath string ) error {
209- if err := m .fetchImageByTag (m .InstallerImageName (versionTag ), versionTag , arch , imageOCIHandler (destPath + tmpSuffix )); err != nil {
149+ if err := m .fetchImageByTag (m .InstallerImageName (versionTag ), versionTag , arch , imagehandler . OCI (destPath + tmpSuffix )); err != nil {
210150 return err
211151 }
212152
@@ -215,7 +155,7 @@ func (m *Manager) fetchInstallerImage(arch Arch, versionTag string, destPath str
215155
216156// fetchTalosctlImage fetches a Talosctl image and exports it to the storage.
217157func (m * Manager ) fetchTalosctlImage (versionTag string , destPath string ) error {
218- if err := m .fetchImageByTag (m .options .TalosctlImage , versionTag , ArchAmd64 , imageExportHandler (func (logger * zap.Logger , r io.Reader ) error {
158+ if err := m .fetchImageByTag (m .options .TalosctlImage , versionTag , ArchAmd64 , imagehandler . Export (func (logger * zap.Logger , r io.Reader ) error {
219159 return untarWithPrefix (logger , r , "" , destPath + tmpSuffix )
220160 })); err != nil {
221161 return err
0 commit comments