@@ -36,17 +36,18 @@ type UnpackSpec struct {
36
36
BaseDirectory string
37
37
}
38
38
39
- type LayerDigest struct {
39
+ type LayerInfo struct {
40
40
BlobID string
41
41
ChainID string
42
42
ParentChainID string
43
43
Size int64
44
44
BaseDirectory string
45
+ URLs []string
45
46
}
46
47
47
48
type BaseImageInfo struct {
48
- LayersDigest []LayerDigest
49
- Config specsv1.Image
49
+ LayerInfos []LayerInfo
50
+ Config specsv1.Image
50
51
}
51
52
52
53
type VolumeMeta struct {
@@ -55,7 +56,7 @@ type VolumeMeta struct {
55
56
56
57
type Fetcher interface {
57
58
BaseImageInfo (logger lager.Logger , baseImageURL * url.URL ) (BaseImageInfo , error )
58
- StreamBlob (logger lager.Logger , baseImageURL * url.URL , source string ) (io.ReadCloser , int64 , error )
59
+ StreamBlob (logger lager.Logger , baseImageURL * url.URL , layerInfo LayerInfo ) (io.ReadCloser , int64 , error )
59
60
}
60
61
61
62
type DependencyRegisterer interface {
@@ -82,19 +83,17 @@ type VolumeDriver interface {
82
83
}
83
84
84
85
type BaseImagePuller struct {
85
- tarFetcher Fetcher
86
- layerFetcher Fetcher
86
+ fetcher Fetcher
87
87
unpacker Unpacker
88
88
volumeDriver VolumeDriver
89
89
dependencyRegisterer DependencyRegisterer
90
90
metricsEmitter groot.MetricsEmitter
91
91
locksmith groot.Locksmith
92
92
}
93
93
94
- func NewBaseImagePuller (tarFetcher , layerFetcher Fetcher , unpacker Unpacker , volumeDriver VolumeDriver , dependencyRegisterer DependencyRegisterer , metricsEmitter groot.MetricsEmitter , locksmith groot.Locksmith ) * BaseImagePuller {
94
+ func NewBaseImagePuller (fetcher Fetcher , unpacker Unpacker , volumeDriver VolumeDriver , dependencyRegisterer DependencyRegisterer , metricsEmitter groot.MetricsEmitter , locksmith groot.Locksmith ) * BaseImagePuller {
95
95
return & BaseImagePuller {
96
- tarFetcher : tarFetcher ,
97
- layerFetcher : layerFetcher ,
96
+ fetcher : fetcher ,
98
97
unpacker : unpacker ,
99
98
volumeDriver : volumeDriver ,
100
99
dependencyRegisterer : dependencyRegisterer ,
@@ -108,21 +107,21 @@ func (p *BaseImagePuller) Pull(logger lager.Logger, spec groot.BaseImageSpec) (g
108
107
logger .Info ("starting" )
109
108
defer logger .Info ("ending" )
110
109
111
- baseImageInfo , err := p .fetcher ( spec . BaseImageSrc ) .BaseImageInfo (logger , spec .BaseImageSrc )
110
+ baseImageInfo , err := p .fetcher .BaseImageInfo (logger , spec .BaseImageSrc )
112
111
if err != nil {
113
- return groot.BaseImage {}, errorspkg .Wrap (err , "fetching list of digests " )
112
+ return groot.BaseImage {}, errorspkg .Wrap (err , "fetching list of layer infos " )
114
113
}
115
- logger .Debug ("fetched-layers-digests " , lager.Data {"digests " : baseImageInfo .LayersDigest })
114
+ logger .Debug ("fetched-layer-infos " , lager.Data {"infos " : baseImageInfo .LayerInfos })
116
115
117
- if err = p .quotaExceeded (logger , baseImageInfo .LayersDigest , spec ); err != nil {
116
+ if err = p .quotaExceeded (logger , baseImageInfo .LayerInfos , spec ); err != nil {
118
117
return groot.BaseImage {}, err
119
118
}
120
119
121
- err = p .buildLayer (logger , len (baseImageInfo .LayersDigest )- 1 , baseImageInfo .LayersDigest , spec )
120
+ err = p .buildLayer (logger , len (baseImageInfo .LayerInfos )- 1 , baseImageInfo .LayerInfos , spec )
122
121
if err != nil {
123
122
return groot.BaseImage {}, err
124
123
}
125
- chainIDs := p .chainIDs (baseImageInfo .LayersDigest )
124
+ chainIDs := p .chainIDs (baseImageInfo .LayerInfos )
126
125
127
126
baseImageRefName := fmt .Sprintf (BaseImageReferenceFormat , spec .BaseImageSrc .String ())
128
127
if err := p .dependencyRegisterer .Register (baseImageRefName , chainIDs ); err != nil {
@@ -136,20 +135,12 @@ func (p *BaseImagePuller) Pull(logger lager.Logger, spec groot.BaseImageSpec) (g
136
135
return baseImage , nil
137
136
}
138
137
139
- func (p * BaseImagePuller ) fetcher (baseImageURL * url.URL ) Fetcher {
140
- if baseImageURL .Scheme == "" {
141
- return p .tarFetcher
142
- }
143
-
144
- return p .layerFetcher
145
- }
146
-
147
- func (p * BaseImagePuller ) quotaExceeded (logger lager.Logger , layersDigest []LayerDigest , spec groot.BaseImageSpec ) error {
138
+ func (p * BaseImagePuller ) quotaExceeded (logger lager.Logger , layerInfos []LayerInfo , spec groot.BaseImageSpec ) error {
148
139
if spec .ExcludeBaseImageFromQuota || spec .DiskLimit == 0 {
149
140
return nil
150
141
}
151
142
152
- totalSize := p .layersSize (layersDigest )
143
+ totalSize := p .layersSize (layerInfos )
153
144
if totalSize > spec .DiskLimit {
154
145
err := errorspkg .Errorf ("layers exceed disk quota %d/%d bytes" , totalSize , spec .DiskLimit )
155
146
logger .Error ("blob-manifest-size-check-failed" , err , lager.Data {
@@ -163,10 +154,10 @@ func (p *BaseImagePuller) quotaExceeded(logger lager.Logger, layersDigest []Laye
163
154
return nil
164
155
}
165
156
166
- func (p * BaseImagePuller ) chainIDs (layersDigest []LayerDigest ) []string {
157
+ func (p * BaseImagePuller ) chainIDs (layerInfos []LayerInfo ) []string {
167
158
chainIDs := []string {}
168
- for _ , layerDigest := range layersDigest {
169
- chainIDs = append (chainIDs , layerDigest .ChainID )
159
+ for _ , layerInfo := range layerInfos {
160
+ chainIDs = append (chainIDs , layerInfo .ChainID )
170
161
}
171
162
return chainIDs
172
163
}
@@ -184,35 +175,35 @@ func (p *BaseImagePuller) volumeExists(logger lager.Logger, chainID string) bool
184
175
return false
185
176
}
186
177
187
- func (p * BaseImagePuller ) buildLayer (logger lager.Logger , index int , layersDigests []LayerDigest , spec groot.BaseImageSpec ) error {
178
+ func (p * BaseImagePuller ) buildLayer (logger lager.Logger , index int , layerInfos []LayerInfo , spec groot.BaseImageSpec ) error {
188
179
if index < 0 {
189
180
return nil
190
181
}
191
182
192
- digest := layersDigests [index ]
183
+ layerInfo := layerInfos [index ]
193
184
logger = logger .Session ("build-layer" , lager.Data {
194
- "blobID" : digest .BlobID ,
195
- "chainID" : digest .ChainID ,
196
- "parentChainID" : digest .ParentChainID ,
185
+ "blobID" : layerInfo .BlobID ,
186
+ "chainID" : layerInfo .ChainID ,
187
+ "parentChainID" : layerInfo .ParentChainID ,
197
188
})
198
- if p .volumeExists (logger , digest .ChainID ) {
189
+ if p .volumeExists (logger , layerInfo .ChainID ) {
199
190
return nil
200
191
}
201
192
202
- lockFile , err := p .locksmith .Lock (digest .ChainID )
193
+ lockFile , err := p .locksmith .Lock (layerInfo .ChainID )
203
194
if err != nil {
204
195
return errorspkg .Wrap (err , "acquiring lock" )
205
196
}
206
197
defer p .locksmith .Unlock (lockFile )
207
198
208
- if p .volumeExists (logger , digest .ChainID ) {
199
+ if p .volumeExists (logger , layerInfo .ChainID ) {
209
200
return nil
210
201
}
211
202
212
203
downloadChan := make (chan downloadReturn , 1 )
213
- go p .downloadLayer (logger , spec , digest , downloadChan )
204
+ go p .downloadLayer (logger , spec , layerInfo , downloadChan )
214
205
215
- if err := p .buildLayer (logger , index - 1 , layersDigests , spec ); err != nil {
206
+ if err := p .buildLayer (logger , index - 1 , layerInfos , spec ); err != nil {
216
207
return err
217
208
}
218
209
@@ -223,27 +214,27 @@ func (p *BaseImagePuller) buildLayer(logger lager.Logger, index int, layersDiges
223
214
224
215
defer downloadResult .Stream .Close ()
225
216
226
- var parentDigest LayerDigest
217
+ var parentLayerInfo LayerInfo
227
218
if index > 0 {
228
- parentDigest = layersDigests [index - 1 ]
219
+ parentLayerInfo = layerInfos [index - 1 ]
229
220
}
230
- return p .unpackLayer (logger , digest , parentDigest , spec , downloadResult .Stream )
221
+ return p .unpackLayer (logger , layerInfo , parentLayerInfo , spec , downloadResult .Stream )
231
222
}
232
223
233
224
type downloadReturn struct {
234
225
Stream io.ReadCloser
235
226
Err error
236
227
}
237
228
238
- func (p * BaseImagePuller ) downloadLayer (logger lager.Logger , spec groot.BaseImageSpec , digest LayerDigest , downloadChan chan downloadReturn ) {
239
- logger = logger .Session ("downloading-layer" , lager.Data {"LayerDigest " : digest })
229
+ func (p * BaseImagePuller ) downloadLayer (logger lager.Logger , spec groot.BaseImageSpec , layerInfo LayerInfo , downloadChan chan downloadReturn ) {
230
+ logger = logger .Session ("downloading-layer" , lager.Data {"LayerInfo " : layerInfo })
240
231
logger .Debug ("starting" )
241
232
defer logger .Debug ("ending" )
242
233
defer p .metricsEmitter .TryEmitDurationFrom (logger , MetricsDownloadTimeName , time .Now ())
243
234
244
- stream , size , err := p .fetcher ( spec . BaseImageSrc ). StreamBlob (logger , spec .BaseImageSrc , digest . BlobID )
235
+ stream , size , err := p .fetcher . StreamBlob (logger , spec .BaseImageSrc , layerInfo )
245
236
if err != nil {
246
- err = errorspkg .Wrapf (err , "streaming blob `%s`" , digest .BlobID )
237
+ err = errorspkg .Wrapf (err , "streaming blob `%s`" , layerInfo .BlobID )
247
238
}
248
239
249
240
logger .Debug ("got-stream-for-blob" , lager.Data {
@@ -255,12 +246,12 @@ func (p *BaseImagePuller) downloadLayer(logger lager.Logger, spec groot.BaseImag
255
246
downloadChan <- downloadReturn {Stream : stream , Err : err }
256
247
}
257
248
258
- func (p * BaseImagePuller ) unpackLayer (logger lager.Logger , digest , parentDigest LayerDigest , spec groot.BaseImageSpec , stream io.ReadCloser ) error {
259
- logger = logger .Session ("unpacking-layer" , lager.Data {"LayerDigest " : digest })
249
+ func (p * BaseImagePuller ) unpackLayer (logger lager.Logger , layerInfo , parentLayerInfo LayerInfo , spec groot.BaseImageSpec , stream io.ReadCloser ) error {
250
+ logger = logger .Session ("unpacking-layer" , lager.Data {"LayerInfo " : layerInfo })
260
251
logger .Debug ("starting" )
261
252
defer logger .Debug ("ending" )
262
253
263
- tempVolumeName , volumePath , err := p .createTemporaryVolumeDirectory (logger , digest , spec )
254
+ tempVolumeName , volumePath , err := p .createTemporaryVolumeDirectory (logger , layerInfo , spec )
264
255
if err != nil {
265
256
return err
266
257
}
@@ -270,25 +261,25 @@ func (p *BaseImagePuller) unpackLayer(logger lager.Logger, digest, parentDigest
270
261
Stream : stream ,
271
262
UIDMappings : spec .UIDMappings ,
272
263
GIDMappings : spec .GIDMappings ,
273
- BaseDirectory : digest .BaseDirectory ,
264
+ BaseDirectory : layerInfo .BaseDirectory ,
274
265
}
275
266
276
- volSize , err := p .unpackLayerToTemporaryDirectory (logger , unpackSpec , digest , parentDigest )
267
+ volSize , err := p .unpackLayerToTemporaryDirectory (logger , unpackSpec , layerInfo , parentLayerInfo )
277
268
if err != nil {
278
269
return err
279
270
}
280
271
281
- return p .finalizeVolume (logger , tempVolumeName , volumePath , digest .ChainID , volSize )
272
+ return p .finalizeVolume (logger , tempVolumeName , volumePath , layerInfo .ChainID , volSize )
282
273
}
283
274
284
- func (p * BaseImagePuller ) createTemporaryVolumeDirectory (logger lager.Logger , digest LayerDigest , spec groot.BaseImageSpec ) (string , string , error ) {
285
- tempVolumeName := fmt .Sprintf ("%s-incomplete-%d-%d" , digest .ChainID , time .Now ().UnixNano (), rand .Int ())
275
+ func (p * BaseImagePuller ) createTemporaryVolumeDirectory (logger lager.Logger , layerInfo LayerInfo , spec groot.BaseImageSpec ) (string , string , error ) {
276
+ tempVolumeName := fmt .Sprintf ("%s-incomplete-%d-%d" , layerInfo .ChainID , time .Now ().UnixNano (), rand .Int ())
286
277
volumePath , err := p .volumeDriver .CreateVolume (logger ,
287
- digest .ParentChainID ,
278
+ layerInfo .ParentChainID ,
288
279
tempVolumeName ,
289
280
)
290
281
if err != nil {
291
- return "" , "" , errorspkg .Wrapf (err , "creating volume for layer `%s`" , digest .BlobID )
282
+ return "" , "" , errorspkg .Wrapf (err , "creating volume for layer `%s`" , layerInfo .BlobID )
292
283
}
293
284
logger .Debug ("volume-created" , lager.Data {"volumePath" : volumePath })
294
285
@@ -302,11 +293,11 @@ func (p *BaseImagePuller) createTemporaryVolumeDirectory(logger lager.Logger, di
302
293
return tempVolumeName , volumePath , nil
303
294
}
304
295
305
- func (p * BaseImagePuller ) unpackLayerToTemporaryDirectory (logger lager.Logger , unpackSpec UnpackSpec , digest , parentDigest LayerDigest ) (volSize int64 , err error ) {
296
+ func (p * BaseImagePuller ) unpackLayerToTemporaryDirectory (logger lager.Logger , unpackSpec UnpackSpec , layerInfo , parentLayerInfo LayerInfo ) (volSize int64 , err error ) {
306
297
defer p .metricsEmitter .TryEmitDurationFrom (logger , MetricsUnpackTimeName , time .Now ())
307
298
308
299
if unpackSpec .BaseDirectory != "" {
309
- parentPath , err := p .volumeDriver .VolumePath (logger , parentDigest .ChainID )
300
+ parentPath , err := p .volumeDriver .VolumePath (logger , parentLayerInfo .ChainID )
310
301
if err != nil {
311
302
return 0 , err
312
303
}
@@ -318,10 +309,10 @@ func (p *BaseImagePuller) unpackLayerToTemporaryDirectory(logger lager.Logger, u
318
309
319
310
var unpackOutput UnpackOutput
320
311
if unpackOutput , err = p .unpacker .Unpack (logger , unpackSpec ); err != nil {
321
- if errD := p .volumeDriver .DestroyVolume (logger , digest .ChainID ); errD != nil {
312
+ if errD := p .volumeDriver .DestroyVolume (logger , layerInfo .ChainID ); errD != nil {
322
313
logger .Error ("volume-cleanup-failed" , errD )
323
314
}
324
- return 0 , errorspkg .Wrapf (err , "unpacking layer `%s`" , digest .BlobID )
315
+ return 0 , errorspkg .Wrapf (err , "unpacking layer `%s`" , layerInfo .BlobID )
325
316
}
326
317
327
318
if err := p .volumeDriver .HandleOpaqueWhiteouts (logger , path .Base (unpackSpec .TargetPath ), unpackOutput .OpaqueWhiteouts ); err != nil {
@@ -346,10 +337,10 @@ func (p *BaseImagePuller) finalizeVolume(logger lager.Logger, tempVolumeName, vo
346
337
return nil
347
338
}
348
339
349
- func (p * BaseImagePuller ) layersSize (layerDigests []LayerDigest ) int64 {
340
+ func (p * BaseImagePuller ) layersSize (layerInfos []LayerInfo ) int64 {
350
341
var totalSize int64
351
- for _ , digest := range layerDigests {
352
- totalSize += digest .Size
342
+ for _ , layerInfo := range layerInfos {
343
+ totalSize += layerInfo .Size
353
344
}
354
345
return totalSize
355
346
}
0 commit comments