Skip to content

Commit 9fb299d

Browse files
Track OS information for images, prune status tags
Unify location of some base layer constants
1 parent db3845c commit 9fb299d

File tree

6 files changed

+39
-8
lines changed

6 files changed

+39
-8
lines changed

pkg/image/apis/image/dockertypes.go

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ type DockerImageConfig struct {
139139
Size int64 `json:"size,omitempty"`
140140
RootFS *DockerConfigRootFS `json:"rootfs,omitempty"`
141141
History []DockerConfigHistory `json:"history,omitempty"`
142+
OS string `json:"os,omitempty"`
142143
OSVersion string `json:"os.version,omitempty"`
143144
OSFeatures []string `json:"os.features,omitempty"`
144145
}

pkg/image/dockerlayer/dockerlayer.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package dockerlayer
2+
3+
// GzippedEmptyLayer is a gzip-compressed version of an empty tar file (1024 NULL bytes)
4+
// This comes from github.com/docker/distribution/manifest/schema1/config_builder.go; there is
5+
// a non-zero embedded timestamp; we could zero that, but that would just waste storage space
6+
// in registries, so let’s use the same values.
7+
var GzippedEmptyLayer = []byte{
8+
31, 139, 8, 0, 0, 9, 110, 136, 0, 255, 98, 24, 5, 163, 96, 20, 140, 88,
9+
0, 8, 0, 0, 255, 255, 46, 175, 181, 239, 0, 4, 0, 0,
10+
}
11+
12+
const (
13+
// GzippedEmptyLayerDigest is a digest of GzippedEmptyLayer
14+
GzippedEmptyLayerDigest = "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
15+
// EmptyLayerDiffID is the tarsum of the GzippedEmptyLayer
16+
EmptyLayerDiffID = "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
17+
// DigestSha256EmptyTar is the canonical sha256 digest of empty data
18+
DigestSha256EmptyTar = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
19+
)

pkg/image/registry/imagestream/strategy.go

+11
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ func (s Strategy) NamespaceScoped() bool {
6666
return true
6767
}
6868

69+
// collapseEmptyStatusTags removes status tags that are completely empty.
70+
func collapseEmptyStatusTags(stream *imageapi.ImageStream) {
71+
for tag, ref := range stream.Status.Tags {
72+
if len(ref.Items) == 0 && len(ref.Conditions) == 0 {
73+
delete(stream.Status.Tags, tag)
74+
}
75+
}
76+
}
77+
6978
// PrepareForCreate clears fields that are not allowed to be set by end users on creation.
7079
func (s Strategy) PrepareForCreate(ctx apirequest.Context, obj runtime.Object) {
7180
stream := obj.(*imageapi.ImageStream)
@@ -78,6 +87,7 @@ func (s Strategy) PrepareForCreate(ctx apirequest.Context, obj runtime.Object) {
7887
ref.Generation = &stream.Generation
7988
stream.Spec.Tags[tag] = ref
8089
}
90+
collapseEmptyStatusTags(stream)
8191
}
8292

8393
// Validate validates a new image stream and verifies the current user is
@@ -510,6 +520,7 @@ func (s Strategy) prepareForUpdate(obj, old runtime.Object, resetStatus bool) {
510520
oldStream := old.(*imageapi.ImageStream)
511521
stream := obj.(*imageapi.ImageStream)
512522

523+
collapseEmptyStatusTags(stream)
513524
stream.Generation = oldStream.Generation
514525
if resetStatus {
515526
stream.Status = oldStream.Status

pkg/image/registry/imagestreamtag/rest.go

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package imagestreamtag
33
import (
44
"fmt"
55

6+
"github.com/golang/glog"
7+
68
kapierrors "k8s.io/apimachinery/pkg/api/errors"
79
metainternal "k8s.io/apimachinery/pkg/apis/meta/internalversion"
810
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -383,6 +385,7 @@ func newISTag(tag string, imageStream *imageapi.ImageStream, image *imageapi.Ima
383385
event := imageapi.LatestTaggedImage(imageStream, tag)
384386
if event == nil || len(event.Image) == 0 {
385387
if !allowEmptyEvent {
388+
glog.V(4).Infof("did not find tag %s in image stream status tags: %#v", tag, imageStream.Status.Tags)
386389
return nil, kapierrors.NewNotFound(imageapi.Resource("imagestreamtags"), istagName)
387390
}
388391
event = &imageapi.TagEvent{

pkg/oc/admin/top/graph.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
kapi "k8s.io/kubernetes/pkg/apis/core"
88

99
imageapi "github.com/openshift/origin/pkg/image/apis/image"
10+
"github.com/openshift/origin/pkg/image/dockerlayer"
1011
"github.com/openshift/origin/pkg/oc/graph/genericgraph"
1112
imagegraph "github.com/openshift/origin/pkg/oc/graph/imagegraph/nodes"
1213
kubegraph "github.com/openshift/origin/pkg/oc/graph/kubegraph/nodes"
@@ -19,11 +20,6 @@ const (
1920
HistoricImageStreamImageEdgeKind = "HistoricImageStreamImage"
2021
PodImageEdgeKind = "PodImage"
2122
ParentImageEdgeKind = "ParentImage"
22-
23-
// digestSha256EmptyTar is the canonical sha256 digest of empty data
24-
digestSHA256EmptyTar = "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
25-
// digest.DigestSha256EmptyTar is empty layer digest, whereas this is gzipped digest of empty layer
26-
digestSHA256GzippedEmptyTar = "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
2723
)
2824

2925
func getImageNodes(nodes []gonum.Node) []*imagegraph.ImageNode {
@@ -53,7 +49,7 @@ func addImagesToGraph(g genericgraph.Graph, images *imageapi.ImageList) {
5349
layer := image.DockerImageLayers[i]
5450
layerNode := imagegraph.EnsureImageComponentLayerNode(g, layer.Name)
5551
edgeKind := ImageLayerEdgeKind
56-
if !topLayerAdded && layer.Name != digestSHA256EmptyTar && layer.Name != digestSHA256GzippedEmptyTar {
52+
if !topLayerAdded && layer.Name != dockerlayer.DigestSha256EmptyTar && layer.Name != dockerlayer.GzippedEmptyLayerDigest {
5753
edgeKind = ImageTopLayerEdgeKind
5854
topLayerAdded = true
5955
}

pkg/oc/admin/top/images_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
appsapi "github.com/openshift/origin/pkg/apps/apis/apps"
1010
buildapi "github.com/openshift/origin/pkg/build/apis/build"
1111
imageapi "github.com/openshift/origin/pkg/image/apis/image"
12+
"github.com/openshift/origin/pkg/image/dockerlayer"
1213
)
1314

1415
func TestImagesTop(t *testing.T) {
@@ -298,7 +299,7 @@ func TestImagesTop(t *testing.T) {
298299
ObjectMeta: metav1.ObjectMeta{Name: "image2"},
299300
DockerImageLayers: []imageapi.ImageLayer{
300301
{Name: "layer1"},
301-
{Name: digestSHA256EmptyTar},
302+
{Name: dockerlayer.DigestSha256EmptyTar},
302303
{Name: "layer2"},
303304
},
304305
DockerImageManifest: "non empty metadata",
@@ -336,7 +337,7 @@ func TestImagesTop(t *testing.T) {
336337
ObjectMeta: metav1.ObjectMeta{Name: "image2"},
337338
DockerImageLayers: []imageapi.ImageLayer{
338339
{Name: "layer1"},
339-
{Name: digestSHA256GzippedEmptyTar},
340+
{Name: dockerlayer.GzippedEmptyLayerDigest},
340341
{Name: "layer2"},
341342
},
342343
DockerImageManifest: "non empty metadata",

0 commit comments

Comments
 (0)