Skip to content

Commit 00de183

Browse files
Add tests for layers
1 parent c079a43 commit 00de183

File tree

2 files changed

+215
-95
lines changed

2 files changed

+215
-95
lines changed

test/extended/images/layers.go

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package images
2+
3+
import (
4+
"time"
5+
6+
g "github.com/onsi/ginkgo"
7+
o "github.com/onsi/gomega"
8+
9+
kapi "k8s.io/api/core/v1"
10+
"k8s.io/apimachinery/pkg/api/errors"
11+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/util/wait"
13+
14+
buildapi "github.com/openshift/api/build/v1"
15+
imageapi "github.com/openshift/api/image/v1"
16+
buildclientset "github.com/openshift/client-go/build/clientset/versioned"
17+
imageclientset "github.com/openshift/client-go/image/clientset/versioned"
18+
exutil "github.com/openshift/origin/test/extended/util"
19+
)
20+
21+
var _ = g.Describe("[Feature:ImageLayers] Image layer subresource", func() {
22+
defer g.GinkgoRecover()
23+
var oc = exutil.NewCLI("image-layers", exutil.KubeConfigPath())
24+
25+
g.It("should return layers from tagged images", func() {
26+
client := imageclientset.NewForConfigOrDie(oc.UserConfig()).Image()
27+
isi, err := client.ImageStreamImports(oc.Namespace()).Create(&imageapi.ImageStreamImport{
28+
ObjectMeta: metav1.ObjectMeta{
29+
Name: "1",
30+
},
31+
Spec: imageapi.ImageStreamImportSpec{
32+
Import: true,
33+
Images: []imageapi.ImageImportSpec{
34+
{
35+
From: kapi.ObjectReference{Kind: "DockerImage", Name: "busybox:latest"},
36+
To: &kapi.LocalObjectReference{Name: "busybox"},
37+
},
38+
{
39+
From: kapi.ObjectReference{Kind: "DockerImage", Name: "mysql:latest"},
40+
To: &kapi.LocalObjectReference{Name: "mysql"},
41+
},
42+
},
43+
},
44+
})
45+
o.Expect(err).NotTo(o.HaveOccurred())
46+
o.Expect(isi.Status.Images).To(o.HaveLen(2))
47+
48+
// TODO: we may race here with the cache, if this is a problem, loop
49+
g.By("verifying that layers for imported images are correct")
50+
layers, err := client.ImageStreams(oc.Namespace()).Layers("1")
51+
o.Expect(err).NotTo(o.HaveOccurred())
52+
var busyboxLayers []string
53+
var busyboxDigest string
54+
for _, image := range isi.Status.Images {
55+
l, ok := layers.Layers[image.Image.Name]
56+
o.Expect(ok).To(o.BeTrue())
57+
o.Expect(len(l)).To(o.BeNumerically(">", 0))
58+
for _, layerID := range l {
59+
o.Expect(layers.Blobs).To(o.HaveKey(layerID))
60+
o.Expect(layers.Blobs[layerID].MediaType).NotTo(o.BeEmpty())
61+
}
62+
if image.Tag == "busybox" {
63+
busyboxLayers = l
64+
busyboxDigest = image.Image.Name
65+
}
66+
o.Expect(layers.Manifests).To(o.HaveKey(image.Image.Name))
67+
}
68+
69+
_, err = client.ImageStreams(oc.Namespace()).Create(&imageapi.ImageStream{
70+
ObjectMeta: metav1.ObjectMeta{
71+
Name: "output",
72+
},
73+
})
74+
o.Expect(err).NotTo(o.HaveOccurred())
75+
76+
layers, err = client.ImageStreams(oc.Namespace()).Layers("output")
77+
o.Expect(err).NotTo(o.HaveOccurred())
78+
o.Expect(layers.Layers).To(o.BeEmpty())
79+
o.Expect(layers.Blobs).To(o.BeEmpty())
80+
o.Expect(layers.Manifests).To(o.BeEmpty())
81+
82+
_, err = client.ImageStreams(oc.Namespace()).Layers("doesnotexist")
83+
o.Expect(err).To(o.HaveOccurred())
84+
o.Expect(errors.IsNotFound(err)).To(o.BeTrue())
85+
86+
dockerfile := `
87+
FROM a
88+
RUN echo "a" > /var/lib/file
89+
`
90+
91+
g.By("running a build based on our tagged layer")
92+
buildClient := buildclientset.NewForConfigOrDie(oc.UserConfig()).Build()
93+
_, err = buildClient.Builds(oc.Namespace()).Create(&buildapi.Build{
94+
ObjectMeta: metav1.ObjectMeta{
95+
Name: "output",
96+
},
97+
Spec: buildapi.BuildSpec{
98+
CommonSpec: buildapi.CommonSpec{
99+
Source: buildapi.BuildSource{
100+
Dockerfile: &dockerfile,
101+
},
102+
Strategy: buildapi.BuildStrategy{
103+
DockerStrategy: &buildapi.DockerBuildStrategy{
104+
From: &kapi.ObjectReference{Kind: "ImageStreamTag", Name: "busybox:latest"},
105+
},
106+
},
107+
Output: buildapi.BuildOutput{
108+
To: &kapi.ObjectReference{Kind: "ImageStreamTag", Name: "output:latest"},
109+
},
110+
},
111+
},
112+
})
113+
o.Expect(err).NotTo(o.HaveOccurred())
114+
115+
newNamespace := oc.CreateProject()
116+
117+
g.By("waiting for the build to finish")
118+
var lastBuild *buildapi.Build
119+
err = wait.Poll(time.Second, time.Minute, func() (bool, error) {
120+
build, err := buildClient.Builds(oc.Namespace()).Get("output", metav1.GetOptions{})
121+
if err != nil {
122+
return false, err
123+
}
124+
o.Expect(build.Status.Phase).NotTo(o.Or(o.Equal(buildapi.BuildPhaseFailed), o.Equal(buildapi.BuildPhaseError), o.Equal(buildapi.BuildPhaseCancelled)))
125+
lastBuild = build
126+
return build.Status.Phase == buildapi.BuildPhaseComplete, nil
127+
})
128+
o.Expect(err).NotTo(o.HaveOccurred())
129+
130+
g.By("checking the layers for the built image")
131+
layers, err = client.ImageStreams(oc.Namespace()).Layers("output")
132+
o.Expect(err).NotTo(o.HaveOccurred())
133+
to := lastBuild.Status.Output.To
134+
o.Expect(to).NotTo(o.BeNil())
135+
o.Expect(layers.Layers).To(o.HaveKey(to.ImageDigest))
136+
builtImageLayers := layers.Layers[to.ImageDigest]
137+
o.Expect(len(builtImageLayers)).To(o.Equal(len(busyboxLayers) + 1))
138+
for i := range busyboxLayers {
139+
o.Expect(busyboxLayers[i]).To(o.Equal(builtImageLayers[i]))
140+
}
141+
o.Expect(layers.Layers).To(o.HaveKey(busyboxDigest))
142+
o.Expect(layers.Layers[busyboxDigest]).To(o.Equal(busyboxLayers))
143+
144+
g.By("tagging the built image into another namespace")
145+
_, err = client.ImageStreamTags(newNamespace).Create(&imageapi.ImageStreamTag{
146+
ObjectMeta: metav1.ObjectMeta{
147+
Name: "output",
148+
},
149+
Tag: &imageapi.TagReference{
150+
Name: "copied",
151+
From: &kapi.ObjectReference{Kind: "ImageStreamTag", Namespace: oc.Namespace(), Name: "output:latest"},
152+
},
153+
})
154+
o.Expect(err).NotTo(o.HaveOccurred())
155+
156+
g.By("checking that the image shows up in the other namespace")
157+
layers, err = client.ImageStreams(newNamespace).Layers("output")
158+
o.Expect(err).NotTo(o.HaveOccurred())
159+
o.Expect(layers.Layers).To(o.HaveKey(to.ImageDigest))
160+
o.Expect(layers.Layers[to.ImageDigest]).To(o.Equal(builtImageLayers))
161+
})
162+
})

0 commit comments

Comments
 (0)