Skip to content

Commit 8f81098

Browse files
author
Michal Minář
committed
Image size needs to add a size of manifest config file
Signed-off-by: Michal Minář <[email protected]>
1 parent 1e3a73a commit 8f81098

File tree

10 files changed

+242
-20
lines changed

10 files changed

+242
-20
lines changed

pkg/cmd/admin/top/images.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,18 @@ func (o TopImagesOptions) imagesTop() []Info {
175175

176176
func getStorage(image *imageapi.Image) int64 {
177177
storage := int64(0)
178-
layerSet := sets.NewString()
178+
blobSet := sets.NewString()
179179
for _, layer := range image.DockerImageLayers {
180-
if layerSet.Has(layer.Name) {
180+
if blobSet.Has(layer.Name) {
181181
continue
182182
}
183-
layerSet.Insert(layer.Name)
183+
blobSet.Insert(layer.Name)
184184
storage += layer.LayerSize
185185
}
186+
if len(image.DockerImageConfig) > 0 && !blobSet.Has(image.DockerImageMetadata.ID) {
187+
blobSet.Insert(image.DockerImageMetadata.ID)
188+
storage += int64(len(image.DockerImageConfig))
189+
}
186190
return storage
187191
}
188192

pkg/cmd/admin/top/images_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,65 @@ func TestImagesTop(t *testing.T) {
8989
},
9090
},
9191
},
92+
"with metadata and image config": {
93+
images: &imageapi.ImageList{
94+
Items: []imageapi.Image{
95+
{
96+
ObjectMeta: kapi.ObjectMeta{Name: "image1"},
97+
DockerImageLayers: []imageapi.ImageLayer{
98+
{Name: "layer1", LayerSize: int64(512)},
99+
{Name: "layer2", LayerSize: int64(512)},
100+
},
101+
DockerImageManifest: "non empty metadata",
102+
DockerImageConfig: "raw image config",
103+
DockerImageMetadata: imageapi.DockerImage{
104+
ID: "manifestConfigID",
105+
},
106+
},
107+
},
108+
},
109+
streams: &imageapi.ImageStreamList{},
110+
pods: &kapi.PodList{},
111+
expected: []Info{
112+
imageInfo{
113+
Image: "image1",
114+
Metadata: true,
115+
Parents: []string{},
116+
Usage: []string{},
117+
Storage: int64(1024 + len("raw image config")),
118+
},
119+
},
120+
},
121+
"with metadata and image config and some layers duplicated": {
122+
images: &imageapi.ImageList{
123+
Items: []imageapi.Image{
124+
{
125+
ObjectMeta: kapi.ObjectMeta{Name: "image1"},
126+
DockerImageLayers: []imageapi.ImageLayer{
127+
{Name: "layer1", LayerSize: int64(512)},
128+
{Name: "layer2", LayerSize: int64(256)},
129+
{Name: "layer1", LayerSize: int64(512)},
130+
},
131+
DockerImageManifest: "non empty metadata",
132+
DockerImageConfig: "raw image config",
133+
DockerImageMetadata: imageapi.DockerImage{
134+
ID: "layer2",
135+
},
136+
},
137+
},
138+
},
139+
streams: &imageapi.ImageStreamList{},
140+
pods: &kapi.PodList{},
141+
expected: []Info{
142+
imageInfo{
143+
Image: "image1",
144+
Metadata: true,
145+
Parents: []string{},
146+
Usage: []string{},
147+
Storage: int64(512 + 256),
148+
},
149+
},
150+
},
92151
"multiple tags": {
93152
images: &imageapi.ImageList{
94153
Items: []imageapi.Image{

pkg/cmd/admin/top/imagestreams.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func getImageStreamSize(g graph.Graph, node *imagegraph.ImageStreamNode) (int64,
144144
storage := int64(0)
145145
images := len(imageEdges)
146146
layers := 0
147-
layerSet := sets.NewString()
147+
blobSet := sets.NewString()
148148
for _, e := range imageEdges {
149149
imageNode, ok := e.To().(*imagegraph.ImageNode)
150150
if !ok {
@@ -154,12 +154,16 @@ func getImageStreamSize(g graph.Graph, node *imagegraph.ImageStreamNode) (int64,
154154
layers += len(image.DockerImageLayers)
155155
// we're counting only unique layers per the entire stream
156156
for _, layer := range image.DockerImageLayers {
157-
if layerSet.Has(layer.Name) {
157+
if blobSet.Has(layer.Name) {
158158
continue
159159
}
160-
layerSet.Insert(layer.Name)
160+
blobSet.Insert(layer.Name)
161161
storage += layer.LayerSize
162162
}
163+
if len(image.DockerImageConfig) > 0 && !blobSet.Has(image.DockerImageMetadata.ID) {
164+
blobSet.Insert(image.DockerImageMetadata.ID)
165+
storage += int64(len(image.DockerImageConfig))
166+
}
163167
}
164168

165169
return storage, images, layers

pkg/cmd/admin/top/imagestreams_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,56 @@ func TestImageStreamsTop(t *testing.T) {
178178
},
179179
},
180180
},
181+
"multiple images with manifest config": {
182+
images: &imageapi.ImageList{
183+
Items: []imageapi.Image{
184+
{
185+
ObjectMeta: kapi.ObjectMeta{Name: "image1"},
186+
DockerImageLayers: []imageapi.ImageLayer{{Name: "layer1", LayerSize: int64(1024)}},
187+
DockerImageConfig: "raw image config",
188+
DockerImageMetadata: imageapi.DockerImage{
189+
ID: "manifestConfigID",
190+
},
191+
},
192+
{
193+
ObjectMeta: kapi.ObjectMeta{Name: "image2"},
194+
DockerImageLayers: []imageapi.ImageLayer{
195+
{Name: "layer1", LayerSize: int64(1024)},
196+
{Name: "layer2", LayerSize: int64(128)},
197+
},
198+
DockerImageConfig: "raw image config",
199+
DockerImageMetadata: imageapi.DockerImage{
200+
ID: "manifestConfigID",
201+
},
202+
},
203+
},
204+
},
205+
streams: &imageapi.ImageStreamList{
206+
Items: []imageapi.ImageStream{
207+
{
208+
ObjectMeta: kapi.ObjectMeta{Name: "stream1", Namespace: "ns1"},
209+
Status: imageapi.ImageStreamStatus{
210+
Tags: map[string]imageapi.TagEventList{
211+
"tag1": {
212+
Items: []imageapi.TagEvent{{Image: "image1"}},
213+
},
214+
"tag2": {
215+
Items: []imageapi.TagEvent{{Image: "image2"}},
216+
},
217+
},
218+
},
219+
},
220+
},
221+
},
222+
expected: []Info{
223+
imageStreamInfo{
224+
ImageStream: "ns1/stream1",
225+
Storage: int64(1152 + len("raw image config")),
226+
Images: 2,
227+
Layers: 3,
228+
},
229+
},
230+
},
181231
"multiple unreferenced images": {
182232
images: &imageapi.ImageList{
183233
Items: []imageapi.Image{

pkg/dockerregistry/server/repositorymiddleware.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ func (r *repository) signedManifestFillImageMetadata(manifest *schema1.SignedMan
452452

453453
refs := manifest.References()
454454

455-
layerSet := sets.NewString()
455+
blobSet := sets.NewString()
456456
image.DockerImageMetadata.Size = int64(0)
457457

458458
blobs := r.Blobs(r.ctx)
@@ -473,11 +473,15 @@ func (r *repository) signedManifestFillImageMetadata(manifest *schema1.SignedMan
473473
}
474474
layer.LayerSize = desc.Size
475475
// count empty layer just once (empty layer may actually have non-zero size)
476-
if !layerSet.Has(layer.Name) {
476+
if !blobSet.Has(layer.Name) {
477477
image.DockerImageMetadata.Size += desc.Size
478-
layerSet.Insert(layer.Name)
478+
blobSet.Insert(layer.Name)
479479
}
480480
}
481+
if len(image.DockerImageConfig) > 0 && !blobSet.Has(image.DockerImageMetadata.ID) {
482+
blobSet.Insert(image.DockerImageMetadata.ID)
483+
image.DockerImageMetadata.Size += int64(len(image.DockerImageConfig))
484+
}
481485

482486
return nil
483487
}

pkg/image/api/helper.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -552,17 +552,15 @@ func ImageWithMetadata(image *Image) error {
552552
image.DockerImageMetadata.Architecture = config.Architecture
553553
image.DockerImageMetadata.Size = int64(len(image.DockerImageConfig))
554554

555+
layerSet := sets.NewString(image.DockerImageMetadata.ID)
555556
if len(image.DockerImageLayers) > 0 {
556-
layerSet := sets.NewString()
557557
for _, layer := range image.DockerImageLayers {
558558
if layerSet.Has(layer.Name) {
559559
continue
560560
}
561561
layerSet.Insert(layer.Name)
562562
image.DockerImageMetadata.Size += layer.LayerSize
563563
}
564-
} else {
565-
image.DockerImageMetadata.Size += config.Size
566564
}
567565
default:
568566
return fmt.Errorf("unrecognized Docker image manifest schema %d for %q (%s)", manifest.SchemaVersion, image.Name, image.DockerImageReference)

pkg/image/importer/client_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type mockRepository struct {
4141

4242
blobs *mockBlobStore
4343

44-
manifest *schema1.SignedManifest
44+
manifest distribution.Manifest
4545
tags map[string]string
4646
}
4747

@@ -79,6 +79,8 @@ func (r *mockRepository) Tags(ctx context.Context) distribution.TagService {
7979
type mockBlobStore struct {
8080
distribution.BlobStore
8181

82+
blobs map[digest.Digest][]byte
83+
8284
statErr, serveErr, openErr error
8385
}
8486

@@ -94,6 +96,14 @@ func (r *mockBlobStore) Open(ctx context.Context, dgst digest.Digest) (distribut
9496
return nil, r.openErr
9597
}
9698

99+
func (r *mockBlobStore) Get(ctx context.Context, dgst digest.Digest) ([]byte, error) {
100+
b, exists := r.blobs[dgst]
101+
if !exists {
102+
return nil, distribution.ErrBlobUnknown
103+
}
104+
return b, nil
105+
}
106+
97107
type mockTagService struct {
98108
distribution.TagService
99109

pkg/image/importer/importer.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -310,15 +310,15 @@ func formatRepositoryError(repository *importRepository, refName string, refID s
310310
func (isi *ImageStreamImporter) calculateImageSize(ctx gocontext.Context, repo distribution.Repository, image *api.Image) error {
311311
bs := repo.Blobs(ctx)
312312

313-
layerSet := sets.NewString()
313+
blobSet := sets.NewString()
314314
size := int64(0)
315315
for i := range image.DockerImageLayers {
316316
layer := &image.DockerImageLayers[i]
317317

318-
if layerSet.Has(layer.Name) {
318+
if blobSet.Has(layer.Name) {
319319
continue
320320
}
321-
layerSet.Insert(layer.Name)
321+
blobSet.Insert(layer.Name)
322322

323323
if layerSize, ok := isi.digestToLayerSizeCache[layer.Name]; ok {
324324
size += layerSize
@@ -335,6 +335,11 @@ func (isi *ImageStreamImporter) calculateImageSize(ctx gocontext.Context, repo d
335335
size += desc.Size
336336
}
337337

338+
if len(image.DockerImageConfig) > 0 && !blobSet.Has(image.DockerImageMetadata.ID) {
339+
blobSet.Insert(image.DockerImageMetadata.ID)
340+
size += int64(len(image.DockerImageConfig))
341+
}
342+
338343
image.DockerImageMetadata.Size = size
339344
return nil
340345
}

0 commit comments

Comments
 (0)