Skip to content

Commit 9e91041

Browse files
committed
add progress output to prometheus
Prometheus now outputs two more pieces of data: the number of layers downloaded and the total amount of layers in the image being downloaded
1 parent 93a077c commit 9e91041

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

client.go

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
104112
func (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

Comments
 (0)