11package e2e
22
33import (
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. \n Output:\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. \n Output:\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. \n Output:\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. \n Output:\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