@@ -1402,6 +1402,7 @@ func TestCVO_UpgradeUnverifiedPayload(t *testing.T) {
1402
1402
t .Fatal ("not the correct error type" )
1403
1403
}
1404
1404
worker := o .configSync .(* SyncWorker )
1405
+ worker .initializedFunc = func () bool { return true }
1405
1406
retriever := worker .retriever .(* fakeDirectoryRetriever )
1406
1407
retriever .Set (PayloadInfo {}, payloadErr )
1407
1408
@@ -1657,7 +1658,7 @@ func TestCVO_ResetPayloadLoadStatus(t *testing.T) {
1657
1658
t .Fatal ("not the correct error type" )
1658
1659
}
1659
1660
worker := o .configSync .(* SyncWorker )
1660
-
1661
+ worker . initializedFunc = func () bool { return true }
1661
1662
// checked by SyncWorker.syncPayload
1662
1663
worker .payload = & payload.Update {Release : o .release }
1663
1664
@@ -1908,6 +1909,7 @@ func TestCVO_UpgradeFailedPayloadLoadWithCapsChanges(t *testing.T) {
1908
1909
t .Fatal ("not the correct error type" )
1909
1910
}
1910
1911
worker := o .configSync .(* SyncWorker )
1912
+ worker .initializedFunc = func () bool { return true }
1911
1913
retriever := worker .retriever .(* fakeDirectoryRetriever )
1912
1914
retriever .Set (PayloadInfo {}, payloadErr )
1913
1915
@@ -2026,6 +2028,7 @@ func TestCVO_InitImplicitlyEnabledCaps(t *testing.T) {
2026
2028
2027
2029
defer shutdownFn ()
2028
2030
worker := o .configSync .(* SyncWorker )
2031
+ worker .initializedFunc = func () bool { return true }
2029
2032
2030
2033
go worker .Start (ctx , 1 )
2031
2034
@@ -2192,6 +2195,7 @@ func TestCVO_UpgradeUnverifiedPayloadRetrieveOnce(t *testing.T) {
2192
2195
t .Fatal ("not the correct error type" )
2193
2196
}
2194
2197
worker := o .configSync .(* SyncWorker )
2198
+ worker .initializedFunc = func () bool { return true }
2195
2199
retriever := worker .retriever .(* fakeDirectoryRetriever )
2196
2200
retriever .Set (PayloadInfo {}, payloadErr )
2197
2201
@@ -2480,6 +2484,7 @@ func TestCVO_UpgradePreconditionFailing(t *testing.T) {
2480
2484
defer shutdownFn ()
2481
2485
2482
2486
worker := o .configSync .(* SyncWorker )
2487
+ worker .initializedFunc = func () bool { return true }
2483
2488
worker .preconditions = []precondition.Precondition {& testPrecondition {SuccessAfter : 3 }}
2484
2489
2485
2490
go worker .Start (ctx , 1 )
@@ -2754,6 +2759,7 @@ func TestCVO_UpgradePreconditionFailingAcceptedRisks(t *testing.T) {
2754
2759
defer shutdownFn ()
2755
2760
2756
2761
worker := o .configSync .(* SyncWorker )
2762
+ worker .initializedFunc = func () bool { return true }
2757
2763
worker .preconditions = []precondition.Precondition {& testPreconditionAlwaysFail {PreConditionName : "PreCondition1" }, & testPreconditionAlwaysFail {PreConditionName : "PreCondition2" }}
2758
2764
2759
2765
go worker .Start (ctx , 1 )
@@ -2856,6 +2862,107 @@ func TestCVO_UpgradePreconditionFailingAcceptedRisks(t *testing.T) {
2856
2862
})
2857
2863
}
2858
2864
2865
+ func TestCVO_UpgradePayloadStillInitializing (t * testing.T ) {
2866
+ o , cvs , client , _ , shutdownFn := setupCVOTest ("testdata/payloadtest" )
2867
+
2868
+ // Setup: an upgrade request from user to a new image and the operator at the same image as before
2869
+ //
2870
+ o .release .Image = "image/image:0"
2871
+ o .release .Version = "1.0.0-abc"
2872
+ desired := configv1.Release {Version : "1.0.1-abc" , Image : "image/image:1" }
2873
+ uid , _ := uuid .NewRandom ()
2874
+ clusterUID := configv1 .ClusterID (uid .String ())
2875
+ cvs ["version" ] = & configv1.ClusterVersion {
2876
+ ObjectMeta : metav1.ObjectMeta {
2877
+ Name : "version" ,
2878
+ ResourceVersion : "1" ,
2879
+ Generation : 1 ,
2880
+ },
2881
+ Spec : configv1.ClusterVersionSpec {
2882
+ ClusterID : clusterUID ,
2883
+ Channel : "fast" ,
2884
+ DesiredUpdate : & configv1.Update {Version : desired .Version , Image : desired .Image },
2885
+ },
2886
+ Status : configv1.ClusterVersionStatus {
2887
+ // Prefers the image version over the operator's version (although in general they will remain in sync)
2888
+ Desired : desired ,
2889
+ VersionHash : "DL-FFQ2Uem8=" ,
2890
+ History : []configv1.UpdateHistory {
2891
+ {State : configv1 .CompletedUpdate , Image : "image/image:0" , Version : "1.0.0-abc" , Verified : true , StartedTime : defaultStartedTime , CompletionTime : & defaultCompletionTime },
2892
+ },
2893
+ Conditions : []configv1.ClusterOperatorStatusCondition {
2894
+ {Type : ImplicitlyEnabledCapabilities , Status : "False" , Reason : "AsExpected" , Message : "Capabilities match configured spec" },
2895
+ {Type : configv1 .OperatorAvailable , Status : configv1 .ConditionTrue , Message : "Done applying 1.0.0-abc" },
2896
+ {Type : ClusterStatusFailing , Status : configv1 .ConditionFalse },
2897
+ {Type : configv1 .OperatorProgressing , Status : configv1 .ConditionFalse , Message : "Cluster version is 1.0.0-abc" },
2898
+ {Type : configv1 .RetrievedUpdates , Status : configv1 .ConditionFalse },
2899
+ },
2900
+ },
2901
+ }
2902
+
2903
+ ctx , cancel := context .WithCancel (context .Background ())
2904
+ defer cancel ()
2905
+
2906
+ defer shutdownFn ()
2907
+
2908
+ worker := o .configSync .(* SyncWorker )
2909
+ retriever := worker .retriever .(* fakeDirectoryRetriever )
2910
+ retriever .Set (PayloadInfo {Directory : "testdata/payloadtest" , Verified : true }, nil )
2911
+
2912
+ go worker .Start (ctx , 1 )
2913
+
2914
+ // Step 1: Simulate a payload being retrieved while the sync worker is not initialized
2915
+ // and ensure the desired version from the operator is taken from the operator and a reconciliation is enqueued
2916
+ client .ClearActions ()
2917
+ err := o .sync (ctx , o .queueKey ())
2918
+ if err != nil {
2919
+ t .Fatal (err )
2920
+ }
2921
+ actions := client .Actions ()
2922
+ if len (actions ) != 2 {
2923
+ t .Fatalf ("%s" , spew .Sdump (actions ))
2924
+ }
2925
+ expectGet (t , actions [0 ], "clusterversions" , "" , "version" )
2926
+ expectUpdateStatus (t , actions [1 ], "clusterversions" , "" , & configv1.ClusterVersion {
2927
+ ObjectMeta : metav1.ObjectMeta {
2928
+ Name : "version" ,
2929
+ ResourceVersion : "1" ,
2930
+ Generation : 1 ,
2931
+ },
2932
+ Spec : configv1.ClusterVersionSpec {
2933
+ ClusterID : clusterUID ,
2934
+ Channel : "fast" ,
2935
+ DesiredUpdate : & configv1.Update {Version : desired .Version , Image : desired .Image },
2936
+ },
2937
+ Status : configv1.ClusterVersionStatus {
2938
+ ObservedGeneration : 1 ,
2939
+ // Prefers the operator's version
2940
+ Desired : configv1.Release {Version : o .release .Version , Image : o .release .Image },
2941
+ VersionHash : "DL-FFQ2Uem8=" ,
2942
+ History : []configv1.UpdateHistory {
2943
+ {State : configv1 .CompletedUpdate , Image : "image/image:0" , Version : "1.0.0-abc" , Verified : true , StartedTime : defaultStartedTime , CompletionTime : & defaultCompletionTime },
2944
+ },
2945
+ Capabilities : configv1.ClusterVersionCapabilitiesStatus {
2946
+ EnabledCapabilities : sortedCaps ,
2947
+ KnownCapabilities : sortedKnownCaps ,
2948
+ },
2949
+ Conditions : []configv1.ClusterOperatorStatusCondition {
2950
+ {Type : ImplicitlyEnabledCapabilities , Status : "False" , Reason : "AsExpected" , Message : "Capabilities match configured spec" },
2951
+ {Type : configv1 .OperatorAvailable , Status : configv1 .ConditionTrue , Message : "Done applying 1.0.0-abc" },
2952
+ {Type : ClusterStatusFailing , Status : configv1 .ConditionFalse },
2953
+ {Type : configv1 .OperatorProgressing , Status : configv1 .ConditionFalse , Message : "Cluster version is 1.0.0-abc" },
2954
+ {Type : configv1 .RetrievedUpdates , Status : configv1 .ConditionFalse },
2955
+ {Type : DesiredReleaseAccepted , Status : configv1 .ConditionTrue , Reason : "PayloadLoaded" ,
2956
+ Message : `Payload loaded version="1.0.0-abc" image="image/image:0" architecture="` + architecture + `"` },
2957
+ },
2958
+ },
2959
+ })
2960
+ if l := o .queue .Len (); l != 1 {
2961
+ t .Errorf ("expecting queue length is 1 but got %d" , l )
2962
+ }
2963
+
2964
+ }
2965
+
2859
2966
func TestCVO_UpgradeVerifiedPayload (t * testing.T ) {
2860
2967
o , cvs , client , _ , shutdownFn := setupCVOTest ("testdata/payloadtest-2" )
2861
2968
@@ -2900,6 +3007,7 @@ func TestCVO_UpgradeVerifiedPayload(t *testing.T) {
2900
3007
defer shutdownFn ()
2901
3008
2902
3009
worker := o .configSync .(* SyncWorker )
3010
+ worker .initializedFunc = func () bool { return true }
2903
3011
retriever := worker .retriever .(* fakeDirectoryRetriever )
2904
3012
retriever .Set (PayloadInfo {Directory : "testdata/payloadtest-2" , Verified : true }, nil )
2905
3013
0 commit comments