@@ -22,6 +22,7 @@ import (
2222 "github.com/containers/buildah/define"
2323 "github.com/containers/buildah/imagebuildah"
2424 "github.com/containers/image/v5/copy"
25+ "github.com/containers/image/v5/image"
2526 "github.com/containers/image/v5/signature"
2627 "github.com/containers/image/v5/storage"
2728 "github.com/containers/image/v5/transports/alltransports"
@@ -75,18 +76,25 @@ func (p *Prometheus) PullImage(imageName, dstName string) (*OciManifest, error)
7576 progressCh := make (chan types.ProgressProperties )
7677 manifestCh := make (chan OciManifest )
7778
79+ var totalLayers int
80+ var doneLayers int
81+
7882 defer close (progressCh )
7983 defer close (manifestCh )
8084
81- err := p .pullImage (imageName , dstName , progressCh , manifestCh )
85+ manifest , err := p .pullImage (imageName , dstName , progressCh , manifestCh )
8286 if err != nil {
8387 return nil , err
8488 }
89+ totalLayers = len (manifest .Layers )
8590 for {
8691 select {
8792 case report := <- progressCh :
88- fmt .Printf ("%s: %v/%v\n " , report .Artifact .Digest .Encoded ()[:12 ], report .Offset , report .Artifact .Size )
89- case manifest := <- manifestCh :
93+ if report .Offset >= uint64 (report .Artifact .Size ) {
94+ doneLayers += 1
95+ }
96+ fmt .Printf ("[%v/%v] %s: %v/%v\n " , doneLayers , totalLayers , report .Artifact .Digest .Encoded ()[:12 ], report .Offset , report .Artifact .Size )
97+ case manifest = <- manifestCh :
9098 return & manifest , nil
9199 }
92100 }
@@ -102,39 +110,59 @@ func (p *Prometheus) PullImage(imageName, dstName string) (*OciManifest, error)
102110// NOTE: The user is responsible for closing both channels once the operation
103111// completes.
104112func (p * Prometheus ) PullImageAsync (imageName , dstName string , progressCh chan types.ProgressProperties , manifestCh chan OciManifest ) error {
105- err := p .pullImage (imageName , dstName , progressCh , manifestCh )
113+ _ , err := p .pullImage (imageName , dstName , progressCh , manifestCh )
106114 return err
107115}
108116
109- func (p * Prometheus ) pullImage (imageName , dstName string , progressCh chan types.ProgressProperties , manifestCh chan OciManifest ) error {
117+ func (p * Prometheus ) pullImage (imageName , dstName string , progressCh chan types.ProgressProperties , manifestCh chan OciManifest ) ( OciManifest , error ) {
110118 srcRef , err := alltransports .ParseImageName (fmt .Sprintf ("docker://%s" , imageName ))
111119 if err != nil {
112- return err
120+ return OciManifest {}, err
113121 }
114122
115123 destRef , err := storage .Transport .ParseStoreReference (p .Store , dstName )
116124 if err != nil {
117- return err
125+ return OciManifest {}, err
118126 }
119127
120128 systemCtx := & types.SystemContext {}
121129 policy , err := signature .DefaultPolicy (systemCtx )
122130 if err != nil {
123- return err
131+ return OciManifest {}, err
124132 }
125133
126134 policyCtx , err := signature .NewPolicyContext (policy )
127135 if err != nil {
128- return err
136+ return OciManifest {}, err
129137 }
130138
131139 duration , err := time .ParseDuration ("100ms" )
132140 if err != nil {
133- return err
141+ return OciManifest {}, err
142+ }
143+
144+ imageSource , err := srcRef .NewImageSource (context .Background (), systemCtx )
145+ if err != nil {
146+ return OciManifest {}, err
147+ }
148+ unparsedInstance := image .UnparsedInstance (imageSource , nil )
149+ rawManifest , _ , err := unparsedInstance .Manifest (context .Background ())
150+ if err != nil {
151+ return OciManifest {}, err
152+ }
153+
154+ var manifest OciManifest
155+ json .Unmarshal (rawManifest , & manifest )
156+
157+ // here we remove the 'sha256:' prefix from the digest, so we don't have
158+ // to deal with it later
159+ manifest .Config .Digest = manifest .Config .Digest [7 :]
160+ for i := range manifest .Layers {
161+ manifest .Layers [i ].Digest = manifest .Layers [i ].Digest [7 :]
134162 }
135163
136164 go func () {
137- pulledManifestBytes , err := copy .Image (
165+ _ , err := copy .Image (
138166 context .Background (),
139167 policyCtx ,
140168 destRef ,
@@ -149,23 +177,10 @@ func (p *Prometheus) pullImage(imageName, dstName string, progressCh chan types.
149177 return
150178 }
151179
152- var manifest OciManifest
153- err = json .Unmarshal (pulledManifestBytes , & manifest )
154- if err != nil {
155- return
156- }
157-
158- // here we remove the 'sha256:' prefix from the digest, so we don't have
159- // to deal with it later
160- manifest .Config .Digest = manifest .Config .Digest [7 :]
161- for i := range manifest .Layers {
162- manifest .Layers [i ].Digest = manifest .Layers [i ].Digest [7 :]
163- }
164-
165180 manifestCh <- manifest
166181 }()
167182
168- return nil
183+ return manifest , nil
169184}
170185
171186/* GetImageByDigest returns an image from the Prometheus store by its digest. */
0 commit comments