Skip to content

Commit ec27aae

Browse files
committed
Update test suite to not include Manual tests
1 parent 2b1b1e0 commit ec27aae

3 files changed

Lines changed: 335 additions & 126 deletions

File tree

cmd/oc-tests-ext/main.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,26 @@ func prepareOperatorTestsRegistry() (*oteextension.Registry, error) {
6666
// The following suite runs tests that verify the oc's behaviour.
6767
// This suite is executed only on pull requests targeting this repository.
6868
// Tests tagged with [Serial] are included in this suite.
69+
// Tests with Manual label will not be included in this suite.
6970
extension.AddSuite(oteextension.Suite{
7071
Name: "openshift/oc/conformance/serial",
7172
Parents: []string{"openshift/conformance/serial"},
7273
Parallelism: 1,
7374
Qualifiers: []string{
74-
`name.contains("[Serial]")`,
75+
`name.contains("[Serial]") && !("Manual" in labels)`,
7576
},
7677
})
7778

7879
// The following suite runs tests that verify the oc's behaviour.
7980
// This suite is executed only on pull requests targeting this repository.
8081
// Parallel tests are included in this suite.
82+
// Tests with Manual label will not be included in this suite.
8183
extension.AddSuite(oteextension.Suite{
8284
Name: "openshift/oc/conformance/parallel",
8385
Parents: []string{"openshift/conformance/parallel"},
8486
Parallelism: 1,
8587
Qualifiers: []string{
86-
`!name.contains("[Serial]")`,
88+
`name.contains("[Serial]") && !("Manual" in labels)`,
8789
},
8890
})
8991

test/e2e/upgrade.go

Lines changed: 130 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,94 @@
11
package e2e
22

33
import (
4+
"context"
45
"encoding/json"
56
"fmt"
6-
"os"
77
"strings"
88
"time"
99

1010
g "github.com/onsi/ginkgo/v2"
1111
o "github.com/onsi/gomega"
12+
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/types"
1215
"k8s.io/apimachinery/pkg/util/wait"
16+
17+
"k8s.io/client-go/tools/clientcmd"
18+
19+
configv1 "github.com/openshift/api/config/v1"
20+
configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
21+
22+
ote "github.com/openshift-eng/openshift-tests-extension/pkg/ginkgo"
1323
)
1424

15-
var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
25+
var _ = g.Describe(`[sig-updates] OTA should`, g.Label("upgrade"), g.Ordered, func() {
1626

1727
defer g.GinkgoRecover()
1828

1929
var (
20-
oc = NewCLI("oc", KubeConfigPath())
21-
testGraphHost = "https://fauxinnati-fauxinnati.apps.ota-stage.q2z4.p1.openshiftapps.com/"
30+
ctx = context.TODO()
31+
kubeConfigPath = KubeConfigPath()
32+
configClient *configv1client.ConfigV1Client
33+
testGraphHost = "https://fauxinnati-fauxinnati.apps.ota-stage.q2z4.p1.openshiftapps.com/"
34+
overrides []configv1.ComponentOverride
35+
oldUpstream configv1.URL
36+
oldChannel string
2237
)
2338

24-
g.BeforeEach(func() {
39+
g.BeforeAll(func() {
40+
config, err := clientcmd.BuildConfigFromFlags("", kubeConfigPath)
41+
o.Expect(err).NotTo(o.HaveOccurred())
42+
configClient, err = configv1client.NewForConfig(config)
43+
o.Expect(err).NotTo(o.HaveOccurred())
44+
oc := NewCLI("oc", kubeConfigPath)
45+
skipIfMicroShift(oc)
46+
SkipIfHypershift(ctx, configClient)
47+
48+
cv, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
49+
o.Expect(err).NotTo(o.HaveOccurred())
50+
51+
oldUpstream = cv.Spec.Upstream
52+
oldChannel = cv.Spec.Channel
53+
54+
overrides = cv.Spec.Overrides
55+
if overrides != nil {
56+
newOverrides := []configv1.ComponentOverride{}
57+
for _, override := range overrides {
58+
if override.Kind != "ClusterImagePolicy" {
59+
newOverrides = append(newOverrides, override)
60+
}
61+
}
62+
cv, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
63+
o.Expect(err).NotTo(o.HaveOccurred())
64+
cv.Spec.Overrides = newOverrides
65+
_, err = configClient.ClusterVersions().Update(ctx, cv, metav1.UpdateOptions{})
66+
o.Expect(err).NotTo(o.HaveOccurred())
67+
}
2568
})
2669

27-
g.AfterEach(func() {
70+
g.AfterAll(func() {
71+
cv, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
72+
o.Expect(err).NotTo(o.HaveOccurred())
73+
74+
overridesJSON, err := json.Marshal(overrides)
75+
o.Expect(err).NotTo(o.HaveOccurred())
76+
77+
updates := []byte{}
78+
if overrides != nil {
79+
updates = []byte(fmt.Sprintf(`{"spec":{"upstream": "%s", "channel": "%s", "overrides": %s}}`, oldUpstream, oldChannel, overridesJSON))
80+
} else {
81+
updates = []byte(fmt.Sprintf(`{"spec":{"upstream": "%s", "channel": "%s"}}`, oldUpstream, oldChannel))
82+
}
83+
_, err = configClient.ClusterVersions().Patch(ctx, cv.Name, types.MergePatchType, updates, metav1.PatchOptions{})
84+
o.Expect(err).NotTo(o.HaveOccurred())
2885
})
2986

3087
g.Context("accept risks exposed to conditional updates", g.Label("accept"), func() {
31-
g.It("Accepted Risks for OCP Cluster Updates", g.Label("TechPreview", "88175", "Slow", "Manual"), func() {
32-
if !isTechPreview(oc) {
33-
g.Skip("Skipping test: only tech-preview clusters supported")
34-
}
35-
os.Setenv("OC_ENABLE_CMD_UPGRADE_ACCEPT_RISKS", "true")
36-
defer os.Unsetenv("OC_ENABLE_CMD_UPGRADE_ACCEPT_RISKS")
37-
38-
g.By("remove overrides from clusterversion version if exists")
39-
overrides, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("clusterversion", "version", "-o", "jsonpath={.spec.overrides}").Output()
40-
if err == nil && strings.Contains(overrides, "ClusterImagePolicy") {
41-
e2e.Logf("overrides: <<%s>>", overrides)
42-
var data []map[string]interface{}
43-
err := json.Unmarshal([]byte(overrides), &data)
44-
o.Expect(err).NotTo(o.HaveOccurred())
45-
_, err = oc.Patch("", "clusterversion/version", []JSONPatchOperation{
46-
{"remove", "/spec/overrides", nil},
47-
})
48-
o.Expect(err).NotTo(o.HaveOccurred())
49-
defer oc.Patch("", "clusterversion/version", []JSONPatchOperation{
50-
{"add", "/spec/overrides", data},
51-
})
52-
}
88+
g.It("Accepted Risks for OCP Cluster Updates", ote.Informing(), g.Label("TechPreview", "88175", "Slow", "Manual"), func() {
89+
SkipIfNotTechPreviewNoUpgrade(ctx, configClient)
5390

54-
clusterVersion, err := GetVersion(oc)
55-
o.Expect(err).NotTo(o.HaveOccurred())
91+
oc := NewCLI("oc", kubeConfigPath).EnvVar("OC_ENABLE_CMD_UPGRADE_ACCEPT_RISKS", "true")
5692

5793
g.By("checking the help info of `oc adm upgrade --help`")
5894
out, err := oc.Run("adm").Args("upgrade", "--help").Output()
@@ -65,30 +101,23 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
65101
o.Expect(out).To(o.ContainSubstring("Manage update risk acceptance."))
66102

67103
g.By("patch fauxinnati upstream")
68-
oldUpstream, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("clusterversion", "version", "-ojsonpath={.spec.upstream}").Output()
69-
o.Expect(err).NotTo(o.HaveOccurred())
70-
oldChannel, err := oc.AsAdmin().WithoutNamespace().Run("get").Args("clusterversion", "version", "-ojsonpath={.spec.channel}").Output()
71-
o.Expect(err).NotTo(o.HaveOccurred())
72104
graph := fmt.Sprintf("%sapi/upgrades_info/graph", testGraphHost)
73105
newChannel := "OCP-88175"
74-
_, err = oc.Patch("", "clusterversion/version", []JSONPatchOperation{
75-
{"add", "/spec/upstream", graph},
76-
{"add", "/spec/channel", newChannel},
77-
})
106+
cv, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
78107
o.Expect(err).NotTo(o.HaveOccurred())
79-
defer oc.Patch("", "clusterversion/version", []JSONPatchOperation{
80-
{"add", "/spec/upstream", oldUpstream},
81-
{"add", "/spec/channel", oldChannel},
82-
})
108+
_, err = configClient.ClusterVersions().Patch(ctx, cv.Name, types.MergePatchType, []byte(fmt.Sprintf(`{"spec":{"upstream": "%s", "channel": "%s"}}`, graph, newChannel)), metav1.PatchOptions{})
109+
o.Expect(err).NotTo(o.HaveOccurred())
110+
83111
g.By("check if new upstream has enough target versions")
84-
fullGraph := fmt.Sprintf("%s?channel=%s&version=%s&arch=amd64", graph, newChannel, clusterVersion.FullVersion)
112+
version, _ := GetCurrentVersionAndImage(cv.Status.History)
113+
fullGraph := fmt.Sprintf("%s?version=%s&channel=%s", graph, version, newChannel)
85114
graphData, err := GetWebResource(fullGraph)
86115
o.Expect(err).NotTo(o.HaveOccurred())
87116
var result map[string]interface{}
88117
err = json.Unmarshal([]byte(graphData), &result)
89118
o.Expect(err).NotTo(o.HaveOccurred())
90119
nodes, ok := result["nodes"].([]interface{})
91-
o.Expect(ok).To(o.BeTrue(), "get nodes failed")
120+
o.Expect(ok).To(o.BeTrue(), "get nodes from graph failed")
92121

93122
extractVersion := func(index int) string {
94123
node, ok := nodes[index].(map[string]interface{})
@@ -118,21 +147,38 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
118147
o.Expect(out).To(o.ContainSubstring(notRecommendVersion2), fmt.Sprintf("non-recommend version is missing %s", notRecommendVersion2))
119148
o.Expect(out).To(o.ContainSubstring(notRecommendVersion3), fmt.Sprintf("non-recommend version is missing %s", notRecommendVersion3))
120149

121-
g.By("upgrade to a non recommend version")
150+
g.By("checking upgrade to a non recommend version is blocked")
122151
out, err = oc.Run("adm").Args("upgrade", "--to", notRecommendVersion1).Output()
123152
o.Expect(err).To(o.HaveOccurred())
124153
o.Expect(out).To(o.ContainSubstring(fmt.Sprintf("the update %s is not one of the recommended updates, but is available as a conditional update.", notRecommendVersion1)))
125154

126155
g.By("clear risks when the accept risk list is empty")
156+
beforeClearCV, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
157+
o.Expect(err).NotTo(o.HaveOccurred())
127158
out, err = oc.Run("adm").Args("upgrade", "accept", "--clear").Output()
128159
o.Expect(err).NotTo(o.HaveOccurred())
129160
o.Expect(out).To(o.ContainSubstring("info: Accept risks are not changed"))
161+
afterClearCV, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
162+
o.Expect(err).NotTo(o.HaveOccurred())
163+
compareResult, msg := CompareObjects(beforeClearCV.Status.ConditionalUpdateRisks, afterClearCV.Status.ConditionalUpdateRisks, false)
164+
o.Expect(compareResult).To(o.BeTrue(), msg)
165+
compareResult, msg = CompareObjects(beforeClearCV.Status.ConditionalUpdates, afterClearCV.Status.ConditionalUpdates, false)
166+
o.Expect(compareResult).To(o.BeTrue(), msg)
167+
compareResult, msg = CompareObjects(beforeClearCV.Status.Conditions, afterClearCV.Status.Conditions, false)
168+
o.Expect(compareResult).To(o.BeTrue(), msg)
169+
compareResult, msg = CompareObjects(beforeClearCV.Status.Desired, afterClearCV.Status.Desired, false)
170+
o.Expect(compareResult).To(o.BeTrue(), msg)
171+
compareResult, msg = CompareObjects(beforeClearCV.Status.History, afterClearCV.Status.History, false)
172+
o.Expect(compareResult).To(o.BeTrue(), msg)
173+
174+
upgradeConplect, err := WaitUpgradeComplete(oc, 5*time.Minute)
175+
o.Expect(err).NotTo(o.HaveOccurred())
176+
o.Expect(upgradeConplect).To(o.BeTrue())
130177

131178
g.By("Accept risk SomeInvokerThing")
132179
risks := "SomeInvokerThing"
133180
out, err = oc.Run("adm").Args("upgrade", "accept", risks).Output()
134181
o.Expect(err).NotTo(o.HaveOccurred())
135-
o.Expect(out).To(o.ContainSubstring(fmt.Sprintf("info: Accept risks are [%s]", risks)))
136182
out, err = oc.Run("get").Args("clusterversion", "version", "-ojsonpath={.spec.desiredUpdate.acceptRisks}").Output()
137183
o.Expect(err).NotTo(o.HaveOccurred())
138184
o.Expect(out).To(o.ContainSubstring(risks))
@@ -150,10 +196,22 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
150196
})
151197
AssertWaitPollNoErr(err, fmt.Sprintf("the non-recommend version %s is not available after accepting the risk %s. \nOutput:\n%s", notRecommendVersion1, risks, out))
152198

153-
g.By("clear risk again")
199+
afterAcceptRiskCV, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
200+
o.Expect(err).NotTo(o.HaveOccurred())
201+
compareResult, msg = CompareObjects(beforeClearCV.Status.ConditionalUpdateRisks, afterAcceptRiskCV.Status.ConditionalUpdateRisks, true)
202+
o.Expect(compareResult).To(o.BeTrue(), msg)
203+
compareResult, msg = CompareObjects(beforeClearCV.Status.ConditionalUpdates, afterAcceptRiskCV.Status.ConditionalUpdates, true)
204+
o.Expect(compareResult).To(o.BeTrue(), msg)
205+
compareResult, msg = CompareObjects(beforeClearCV.Status.Conditions, afterAcceptRiskCV.Status.Conditions, true)
206+
o.Expect(compareResult).To(o.BeTrue(), msg)
207+
compareResult, msg = CompareObjects(beforeClearCV.Status.Desired, afterAcceptRiskCV.Status.Desired, true)
208+
o.Expect(compareResult).To(o.BeTrue(), msg)
209+
compareResult, msg = CompareObjects(beforeClearCV.Status.History, afterAcceptRiskCV.Status.History, true)
210+
o.Expect(compareResult).To(o.BeTrue(), msg)
211+
212+
g.By("clear command should be able to clear the accepted risks")
154213
out, err = oc.Run("adm").Args("upgrade", "accept", "--clear").Output()
155214
o.Expect(err).NotTo(o.HaveOccurred())
156-
o.Expect(out).To(o.ContainSubstring("info: Accept risks are []"))
157215
out, err = oc.Run("get").Args("clusterversion", "version", "-ojsonpath={.spec.desiredUpdate.acceptRisks}").Output()
158216
o.Expect(err).NotTo(o.HaveOccurred())
159217
o.Expect(out).NotTo(o.ContainSubstring(risks))
@@ -171,6 +229,10 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
171229
})
172230
AssertWaitPollNoErr(err, fmt.Sprintf("the first non-recommend version %s still exists after clearing the risks. \nOutput:\n%s", notRecommendVersion1, out))
173231

232+
upgradeConplect, err = WaitUpgradeComplete(oc, 5*time.Minute)
233+
o.Expect(err).NotTo(o.HaveOccurred())
234+
o.Expect(upgradeConplect).To(o.BeTrue())
235+
174236
g.By("Accept risk SomeInvokerThing,SomeChannelThing")
175237
risks = "SomeInvokerThing,SomeChannelThing"
176238
out, err = oc.Run("adm").Args("upgrade", "accept", risks).Output()
@@ -214,7 +276,6 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
214276
risks = "SomeInfrastructureThing"
215277
out, err = oc.Run("adm").Args("upgrade", "accept", "--replace", risks).Output()
216278
o.Expect(err).NotTo(o.HaveOccurred())
217-
o.Expect(out).To(o.ContainSubstring(fmt.Sprintf("info: Accept risks are [%s]", risks)))
218279
out, err = oc.Run("get").Args("clusterversion", "version", "-ojsonpath={.spec.desiredUpdate.acceptRisks}").Output()
219280
o.Expect(err).NotTo(o.HaveOccurred())
220281
o.Expect(out).To(o.ContainSubstring(risks))
@@ -242,18 +303,28 @@ var _ = g.Describe(`[Jira:"oc adm upgrade"]`, g.Label("upgrade"), func() {
242303
})
243304
AssertWaitPollNoErr(err, fmt.Sprintf("the non-recommend versions are not correct after replace the risk %s. \nOutput:\n%s", risks, out))
244305

245-
g.By("Upgrade to not recommend version")
306+
upgradeConplect, err = WaitUpgradeComplete(oc, 5*time.Minute)
307+
o.Expect(err).NotTo(o.HaveOccurred())
308+
o.Expect(upgradeConplect).To(o.BeTrue())
309+
310+
g.By("Upgrade to a version which risks are accepted should work")
246311
out, err = oc.Run("adm").Args("upgrade", "--to", notRecommendVersion3).Output()
247312
o.Expect(err).NotTo(o.HaveOccurred())
248-
expectedStatus := fmt.Sprintf("Cluster version is %s", notRecommendVersion3)
249-
err = wait.Poll(30*time.Second, 90*time.Minute, func() (bool, error) {
250-
out, _ = oc.Run("get").Args("clusterversion").Output()
251-
if !strings.Contains(out, expectedStatus) {
252-
return false, nil
253-
}
254-
return true, nil
255-
})
256-
AssertWaitPollNoErr(err, fmt.Sprintf("upgrade to version %s failed", notRecommendVersion3))
313+
complete, err := WaitUpgradeComplete(oc, 90*time.Minute)
314+
o.Expect(err).NotTo(o.HaveOccurred())
315+
o.Expect(complete).To(o.BeTrue(), fmt.Sprintf("upgrade to version %s is not complete. \nOutput:\n%s", notRecommendVersion3, out))
316+
317+
afterUpgradeCV, err := configClient.ClusterVersions().Get(ctx, "version", metav1.GetOptions{})
318+
o.Expect(err).NotTo(o.HaveOccurred())
319+
version, _ = GetCurrentVersionAndImage(afterUpgradeCV.Status.History)
320+
o.Expect(version).To(o.Equal(notRecommendVersion3))
321+
322+
acceptRisks := afterUpgradeCV.Status.History[0].AcceptedRisks
323+
o.Expect(acceptRisks).To(o.ContainSubstring(risks))
324+
325+
l := len(beforeClearCV.Status.History)
326+
compareResult, msg = CompareObjects(beforeClearCV.Status.History[l-2], afterUpgradeCV.Status.History[l-1], true)
327+
o.Expect(compareResult).To(o.BeTrue(), msg)
257328

258329
defer oc.Run("adm").Args("upgrade", "accept", "--clear").Output()
259330
})

0 commit comments

Comments
 (0)