Skip to content

Commit 43159a2

Browse files
Merge pull request #30239 from jatinsu/ImageStreamImportMode
MULTIARCH-5391: Add Disruptive ImageStreamImportMode Tests into a Disruptive Suite
2 parents 201cbbf + 36ab967 commit 43159a2

File tree

3 files changed

+163
-147
lines changed

3 files changed

+163
-147
lines changed

pkg/testsuites/standard_suites.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,17 @@ var staticSuites = []ginkgo.TestSuite{
451451
},
452452
TestTimeout: 1 * time.Minute,
453453
},
454+
{
455+
Name: "openshift/test-image-stream-import-mode",
456+
Description: templates.LongDesc(`
457+
This test suite is to validate the ImageStreamImportMode feature.
458+
`),
459+
Qualifiers: []string{
460+
`name.contains("[Suite:openshift/test-image-stream-import-mode")`,
461+
},
462+
TestTimeout: 120 * time.Minute,
463+
ClusterStabilityDuringTest: ginkgo.Disruptive,
464+
},
454465
}
455466

456467
func withExcludedTestsFilter(baseExpr string) string {
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package images
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
corev1 "k8s.io/api/core/v1"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
"k8s.io/apimachinery/pkg/labels"
11+
"k8s.io/apimachinery/pkg/types"
12+
13+
g "github.com/onsi/ginkgo/v2"
14+
o "github.com/onsi/gomega"
15+
configv1 "github.com/openshift/api/config/v1"
16+
imagev1 "github.com/openshift/api/image/v1"
17+
"github.com/openshift/library-go/pkg/image/imageutil"
18+
exutil "github.com/openshift/origin/test/extended/util"
19+
"github.com/openshift/origin/test/extended/util/operator"
20+
)
21+
22+
var _ = g.Describe("[sig-imageregistry][Suite:openshift/test-image-stream-import-mode][OCPFeatureGate:ImageStreamImportMode][Serial][Disruptive] ImageStream API", func() {
23+
defer g.GinkgoRecover()
24+
oc := exutil.NewCLI("imagestream-api")
25+
26+
g.It("import mode should be Legacy if the import mode specified in image.config.openshift.io config is Legacy [apigroup:image.openshift.io]", func() {
27+
TestImageConfigImageStreamImportModeLegacy(g.GinkgoT(), oc)
28+
})
29+
30+
g.It("import mode should be PreserveOriginal if the import mode specified in image.config.openshift.io config is PreserveOriginal [apigroup:image.openshift.io]", func() {
31+
TestImageConfigImageStreamImportModePreserveOriginal(g.GinkgoT(), oc)
32+
})
33+
})
34+
35+
func changeImportModeAndWaitForApiServer(ctx context.Context, t g.GinkgoTInterface, oc *exutil.CLI, importMode string) error {
36+
data := fmt.Sprintf(`{"spec":{"imageStreamImportMode":null}}`)
37+
if len(importMode) > 0 {
38+
data = fmt.Sprintf(`{"spec":{"imageStreamImportMode":"%s"}}`, importMode)
39+
}
40+
_, err := oc.AdminConfigClient().ConfigV1().Images().Patch(context.Background(), "cluster", types.MergePatchType, []byte(data), metav1.PatchOptions{})
41+
if err != nil {
42+
return err
43+
}
44+
45+
// when pods are pending it means the config has started to propagate
46+
t.Log("waiting for image controller configuration to propagate")
47+
_, err = exutil.WaitForPods(oc.AdminKubeClient().CoreV1().Pods("openshift-apiserver"), labels.Everything(), exutil.CheckPodIsPending, 1, 5*time.Minute)
48+
if err != nil {
49+
return fmt.Errorf("error waiting for new apiserver pods: %s", err)
50+
}
51+
52+
t.Log("waiting for new openshift-apiserver operator to settle")
53+
if err := operator.WaitForOperatorsToSettle(ctx, oc.AdminConfigClient(), 10); err != nil {
54+
return err
55+
}
56+
t.Log("image controller configuration propagated")
57+
return nil
58+
}
59+
60+
func TestImageConfigImageStreamImportModeLegacy(t g.GinkgoTInterface, oc *exutil.CLI) {
61+
ctx := context.Background()
62+
63+
clusterAdminConfigClient := oc.AdminConfigClient().ConfigV1()
64+
imageConfig, err := clusterAdminConfigClient.Images().Get(ctx, "cluster", metav1.GetOptions{})
65+
o.Expect(err).NotTo(o.HaveOccurred())
66+
67+
importModeNoChange := false
68+
if imageConfig.Status.ImageStreamImportMode == configv1.ImportModeLegacy {
69+
importModeNoChange = true
70+
}
71+
72+
// If import mode is actually the same as the intended one, skip changing it
73+
if !importModeNoChange {
74+
err = changeImportModeAndWaitForApiServer(ctx, t, oc, string(configv1.ImportModeLegacy))
75+
o.Expect(err).NotTo(o.HaveOccurred())
76+
}
77+
78+
g.By("creating an imagestream and imagestream tag")
79+
stream := &imagev1.ImageStream{ObjectMeta: metav1.ObjectMeta{Name: "test-importmode"}}
80+
81+
clusterAdminImageClient := oc.AdminImageClient().ImageV1()
82+
expected, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Create(ctx, stream, metav1.CreateOptions{})
83+
o.Expect(err).NotTo(o.HaveOccurred())
84+
o.Expect(expected.Name).NotTo(o.BeEmpty())
85+
86+
_, err = clusterAdminImageClient.ImageStreamTags(oc.Namespace()).Create(ctx, &imagev1.ImageStreamTag{
87+
ObjectMeta: metav1.ObjectMeta{Name: "test-importmode:2"},
88+
Tag: &imagev1.TagReference{
89+
From: &corev1.ObjectReference{Kind: "ImageStreamTag", Namespace: "openshift", Name: "tools:latest"},
90+
},
91+
}, metav1.CreateOptions{})
92+
o.Expect(err).ToNot(o.HaveOccurred())
93+
94+
is, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Get(ctx, stream.Name, metav1.GetOptions{})
95+
o.Expect(err).NotTo(o.HaveOccurred())
96+
tag, ok := imageutil.SpecHasTag(is, "2")
97+
o.Expect(ok).To(o.BeTrue())
98+
o.Expect(tag.ImportPolicy.ImportMode).To(o.Equal(imagev1.ImportModeLegacy))
99+
100+
// Revert back to original
101+
if !importModeNoChange {
102+
err = changeImportModeAndWaitForApiServer(ctx, t, oc, "")
103+
o.Expect(err).NotTo(o.HaveOccurred())
104+
}
105+
}
106+
107+
func TestImageConfigImageStreamImportModePreserveOriginal(t g.GinkgoTInterface, oc *exutil.CLI) {
108+
ctx := context.Background()
109+
110+
clusterAdminConfigClient := oc.AdminConfigClient().ConfigV1()
111+
imageConfig, err := clusterAdminConfigClient.Images().Get(ctx, "cluster", metav1.GetOptions{})
112+
o.Expect(err).NotTo(o.HaveOccurred())
113+
114+
importModeNoChange := false
115+
if imageConfig.Status.ImageStreamImportMode == configv1.ImportModePreserveOriginal {
116+
importModeNoChange = true
117+
}
118+
119+
// If import mode is actually the same as the intended one, skip changing it
120+
if !importModeNoChange {
121+
err = changeImportModeAndWaitForApiServer(ctx, t, oc, string(configv1.ImportModePreserveOriginal))
122+
o.Expect(err).NotTo(o.HaveOccurred())
123+
}
124+
125+
g.By("creating an imagestream and imagestream tag")
126+
stream := &imagev1.ImageStream{ObjectMeta: metav1.ObjectMeta{Name: "test-importmode"}}
127+
128+
clusterAdminImageClient := oc.AdminImageClient().ImageV1()
129+
expected, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Create(ctx, stream, metav1.CreateOptions{})
130+
o.Expect(err).NotTo(o.HaveOccurred())
131+
o.Expect(expected.Name).NotTo(o.BeEmpty())
132+
133+
_, err = clusterAdminImageClient.ImageStreamTags(oc.Namespace()).Create(ctx, &imagev1.ImageStreamTag{
134+
ObjectMeta: metav1.ObjectMeta{Name: "test-importmode:3"},
135+
Tag: &imagev1.TagReference{
136+
From: &corev1.ObjectReference{Kind: "ImageStreamTag", Namespace: "openshift", Name: "tools:latest"},
137+
},
138+
}, metav1.CreateOptions{})
139+
o.Expect(err).ToNot(o.HaveOccurred())
140+
141+
is, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Get(ctx, stream.Name, metav1.GetOptions{})
142+
o.Expect(err).NotTo(o.HaveOccurred())
143+
tag, ok := imageutil.SpecHasTag(is, "3")
144+
o.Expect(ok).To(o.BeTrue())
145+
o.Expect(tag.ImportPolicy.ImportMode).To(o.Equal(imagev1.ImportModePreserveOriginal))
146+
147+
// Revert back to original
148+
if !importModeNoChange {
149+
err = changeImportModeAndWaitForApiServer(ctx, t, oc, "")
150+
o.Expect(err).NotTo(o.HaveOccurred())
151+
}
152+
}

test/extended/images/tagimportmode.go

Lines changed: 0 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ package images
22

33
import (
44
"context"
5-
"fmt"
6-
"time"
75

86
corev1 "k8s.io/api/core/v1"
97
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10-
"k8s.io/apimachinery/pkg/labels"
11-
"k8s.io/apimachinery/pkg/types"
128

139
g "github.com/onsi/ginkgo/v2"
1410
o "github.com/onsi/gomega"
@@ -17,7 +13,6 @@ import (
1713
configclient "github.com/openshift/client-go/config/clientset/versioned"
1814
"github.com/openshift/library-go/pkg/image/imageutil"
1915
exutil "github.com/openshift/origin/test/extended/util"
20-
"github.com/openshift/origin/test/extended/util/operator"
2116
)
2217

2318
var _ = g.Describe("[sig-imageregistry][OCPFeatureGate:ImageStreamImportMode][Serial] ImageStream API", func() {
@@ -27,46 +22,10 @@ var _ = g.Describe("[sig-imageregistry][OCPFeatureGate:ImageStreamImportMode][Se
2722
g.It("import mode should be PreserveOriginal or Legacy depending on desired.architecture field in the CV [apigroup:image.openshift.io]", func() {
2823
TestImageStreamImportMode(g.GinkgoT(), oc)
2924
})
30-
31-
g.It("import mode should be Legacy if the import mode specified in image.config.openshift.io config is Legacy [apigroup:image.openshift.io]", func() {
32-
TestImageConfigImageStreamImportModeLegacy(g.GinkgoT(), oc)
33-
})
34-
35-
g.It("import mode should be PreserveOriginal if the import mode specified in image.config.openshift.io config is PreserveOriginal [apigroup:image.openshift.io]", func() {
36-
TestImageConfigImageStreamImportModePreserveOriginal(g.GinkgoT(), oc)
37-
})
3825
})
3926

40-
func changeImportModeAndWaitForApiServer(ctx context.Context, t g.GinkgoTInterface, oc *exutil.CLI, importMode string) error {
41-
data := fmt.Sprintf(`{"spec":{"imageStreamImportMode":null}}`)
42-
if len(importMode) > 0 {
43-
data = fmt.Sprintf(`{"spec":{"imageStreamImportMode":"%s"}}`, importMode)
44-
}
45-
_, err := oc.AdminConfigClient().ConfigV1().Images().Patch(context.Background(), "cluster", types.MergePatchType, []byte(data), metav1.PatchOptions{})
46-
if err != nil {
47-
return err
48-
}
49-
50-
// when pods are pending it means the config has started to propagate
51-
t.Log("waiting for image controller configuration to propagate")
52-
_, err = exutil.WaitForPods(oc.AdminKubeClient().CoreV1().Pods("openshift-apiserver"), labels.Everything(), exutil.CheckPodIsPending, 1, 5*time.Minute)
53-
if err != nil {
54-
return fmt.Errorf("error waiting for new apiserver pods: %s", err)
55-
}
56-
57-
t.Log("waiting for new openshift-apiserver operator to settle")
58-
if err := operator.WaitForOperatorsToSettle(ctx, oc.AdminConfigClient(), 10); err != nil {
59-
return err
60-
}
61-
t.Log("image controller configuration propagated")
62-
return nil
63-
}
64-
6527
func TestImageStreamImportMode(t g.GinkgoTInterface, oc *exutil.CLI) {
6628
ctx := context.Background()
67-
if !exutil.IsTechPreviewNoUpgrade(ctx, oc.AdminConfigClient()) {
68-
g.Skip("skipping, this feature is only supported on TechPreviewNoUpgrade clusters")
69-
}
7029

7130
// Check desired.Architecture in the CV
7231
configClient, err := configclient.NewForConfig(oc.AdminConfig())
@@ -101,109 +60,3 @@ func TestImageStreamImportMode(t g.GinkgoTInterface, oc *exutil.CLI) {
10160
o.Expect(ok).To(o.BeTrue())
10261
o.Expect(tag.ImportPolicy.ImportMode).To(o.Equal(importmode))
10362
}
104-
105-
func TestImageConfigImageStreamImportModeLegacy(t g.GinkgoTInterface, oc *exutil.CLI) {
106-
ctx := context.Background()
107-
if !exutil.IsTechPreviewNoUpgrade(ctx, oc.AdminConfigClient()) {
108-
g.Skip("skipping, this feature is only supported on TechPreviewNoUpgrade clusters")
109-
}
110-
if isSNO, err := exutil.IsSingleNode(ctx, oc.AdminConfigClient()); err == nil && isSNO {
111-
g.Skip("skipping this test for SNO as it involves an openshift-apiserver disruption")
112-
}
113-
114-
clusterAdminConfigClient := oc.AdminConfigClient().ConfigV1()
115-
imageConfig, err := clusterAdminConfigClient.Images().Get(ctx, "cluster", metav1.GetOptions{})
116-
o.Expect(err).NotTo(o.HaveOccurred())
117-
118-
importModeNoChange := false
119-
if imageConfig.Status.ImageStreamImportMode == configv1.ImportModeLegacy {
120-
importModeNoChange = true
121-
}
122-
123-
// If import mode is actually the same as the intended one, skip changing it
124-
if !importModeNoChange {
125-
err = changeImportModeAndWaitForApiServer(ctx, t, oc, string(configv1.ImportModeLegacy))
126-
o.Expect(err).NotTo(o.HaveOccurred())
127-
}
128-
129-
g.By("creating an imagestream and imagestream tag")
130-
stream := &imagev1.ImageStream{ObjectMeta: metav1.ObjectMeta{Name: "test-importmode"}}
131-
132-
clusterAdminImageClient := oc.AdminImageClient().ImageV1()
133-
expected, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Create(ctx, stream, metav1.CreateOptions{})
134-
o.Expect(err).NotTo(o.HaveOccurred())
135-
o.Expect(expected.Name).NotTo(o.BeEmpty())
136-
137-
_, err = clusterAdminImageClient.ImageStreamTags(oc.Namespace()).Create(ctx, &imagev1.ImageStreamTag{
138-
ObjectMeta: metav1.ObjectMeta{Name: "test-importmode:2"},
139-
Tag: &imagev1.TagReference{
140-
From: &corev1.ObjectReference{Kind: "ImageStreamTag", Namespace: "openshift", Name: "tools:latest"},
141-
},
142-
}, metav1.CreateOptions{})
143-
o.Expect(err).ToNot(o.HaveOccurred())
144-
145-
is, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Get(ctx, stream.Name, metav1.GetOptions{})
146-
o.Expect(err).NotTo(o.HaveOccurred())
147-
tag, ok := imageutil.SpecHasTag(is, "2")
148-
o.Expect(ok).To(o.BeTrue())
149-
o.Expect(tag.ImportPolicy.ImportMode).To(o.Equal(imagev1.ImportModeLegacy))
150-
151-
// Revert back to original
152-
if !importModeNoChange {
153-
err = changeImportModeAndWaitForApiServer(ctx, t, oc, "")
154-
o.Expect(err).NotTo(o.HaveOccurred())
155-
}
156-
}
157-
158-
func TestImageConfigImageStreamImportModePreserveOriginal(t g.GinkgoTInterface, oc *exutil.CLI) {
159-
ctx := context.Background()
160-
if !exutil.IsTechPreviewNoUpgrade(ctx, oc.AdminConfigClient()) {
161-
g.Skip("skipping, this feature is only supported on TechPreviewNoUpgrade clusters")
162-
}
163-
if isSNO, err := exutil.IsSingleNode(ctx, oc.AdminConfigClient()); err == nil && isSNO {
164-
g.Skip("skipping this test for SNO as it involves an openshift-apiserver disruption")
165-
}
166-
167-
clusterAdminConfigClient := oc.AdminConfigClient().ConfigV1()
168-
imageConfig, err := clusterAdminConfigClient.Images().Get(ctx, "cluster", metav1.GetOptions{})
169-
o.Expect(err).NotTo(o.HaveOccurred())
170-
171-
importModeNoChange := false
172-
if imageConfig.Status.ImageStreamImportMode == configv1.ImportModePreserveOriginal {
173-
importModeNoChange = true
174-
}
175-
176-
// If import mode is actually the same as the intended one, skip changing it
177-
if !importModeNoChange {
178-
err = changeImportModeAndWaitForApiServer(ctx, t, oc, string(configv1.ImportModePreserveOriginal))
179-
o.Expect(err).NotTo(o.HaveOccurred())
180-
}
181-
182-
g.By("creating an imagestream and imagestream tag")
183-
stream := &imagev1.ImageStream{ObjectMeta: metav1.ObjectMeta{Name: "test-importmode"}}
184-
185-
clusterAdminImageClient := oc.AdminImageClient().ImageV1()
186-
expected, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Create(ctx, stream, metav1.CreateOptions{})
187-
o.Expect(err).NotTo(o.HaveOccurred())
188-
o.Expect(expected.Name).NotTo(o.BeEmpty())
189-
190-
_, err = clusterAdminImageClient.ImageStreamTags(oc.Namespace()).Create(ctx, &imagev1.ImageStreamTag{
191-
ObjectMeta: metav1.ObjectMeta{Name: "test-importmode:3"},
192-
Tag: &imagev1.TagReference{
193-
From: &corev1.ObjectReference{Kind: "ImageStreamTag", Namespace: "openshift", Name: "tools:latest"},
194-
},
195-
}, metav1.CreateOptions{})
196-
o.Expect(err).ToNot(o.HaveOccurred())
197-
198-
is, err := clusterAdminImageClient.ImageStreams(oc.Namespace()).Get(ctx, stream.Name, metav1.GetOptions{})
199-
o.Expect(err).NotTo(o.HaveOccurred())
200-
tag, ok := imageutil.SpecHasTag(is, "3")
201-
o.Expect(ok).To(o.BeTrue())
202-
o.Expect(tag.ImportPolicy.ImportMode).To(o.Equal(imagev1.ImportModePreserveOriginal))
203-
204-
// Revert back to original
205-
if !importModeNoChange {
206-
err = changeImportModeAndWaitForApiServer(ctx, t, oc, "")
207-
o.Expect(err).NotTo(o.HaveOccurred())
208-
}
209-
}

0 commit comments

Comments
 (0)