@@ -64,12 +64,13 @@ func newTestAirgapMetadataWithSequences(releases []airgapReleaseData) *airgap.Ai
6464
6565func TestWithAirgapRequiredReleases (t * testing.T ) {
6666 tests := []struct {
67- name string
68- metadata * airgap.AirgapMetadata
69- currentSequence int64
70- expectedReleases []string
71- expectError bool
72- errorContains string
67+ name string
68+ metadata * airgap.AirgapMetadata
69+ currentSequence int64
70+ expectedReleases []string
71+ expectedCurrentReleaseIsRequired bool
72+ expectError bool
73+ errorContains string
7374 }{
7475 {
7576 name : "no required releases" ,
@@ -102,25 +103,36 @@ func TestWithAirgapRequiredReleases(t *testing.T) {
102103 expectError : false ,
103104 },
104105 {
105- name : "stops at current sequence " ,
106+ name : "all releases older than current " ,
106107 metadata : newTestAirgapMetadataWithSequences ([]airgapReleaseData {
107- {versionLabel : "1.4.0" , updateCursor : "400" },
108- {versionLabel : "1.3.0" , updateCursor : "300" },
109108 {versionLabel : "1.2.0" , updateCursor : "200" },
109+ {versionLabel : "1.1.0" , updateCursor : "100" },
110110 }),
111111 currentSequence : 300 ,
112- expectedReleases : []string {"1.4.0" },
112+ expectedReleases : []string {},
113113 expectError : false ,
114114 },
115115 {
116- name : "all releases older than current" ,
116+ name : "current release is required" ,
117+ metadata : newTestAirgapMetadataWithSequences ([]airgapReleaseData {
118+ {versionLabel : "1.0.0" , updateCursor : "300" },
119+ }),
120+ currentSequence : 300 ,
121+ expectedReleases : []string {},
122+ expectError : false ,
123+ expectedCurrentReleaseIsRequired : true ,
124+ },
125+ {
126+ name : "current release is required and there's other required releases" ,
117127 metadata : newTestAirgapMetadataWithSequences ([]airgapReleaseData {
128+ {versionLabel : "1.4.0" , updateCursor : "400" },
129+ {versionLabel : "1.3.0" , updateCursor : "300" },
118130 {versionLabel : "1.2.0" , updateCursor : "200" },
119- {versionLabel : "1.1.0" , updateCursor : "100" },
120131 }),
121- currentSequence : 300 ,
122- expectedReleases : []string {},
123- expectError : false ,
132+ currentSequence : 300 ,
133+ expectedReleases : []string {"1.4.0" },
134+ expectedCurrentReleaseIsRequired : true ,
135+ expectError : false ,
124136 },
125137 {
126138 name : "nil metadata" ,
@@ -167,18 +179,20 @@ func TestWithAirgapRequiredReleases(t *testing.T) {
167179 } else {
168180 assert .Equal (t , tt .expectedReleases , opts .requiredReleases )
169181 }
182+ assert .Equal (t , tt .expectedCurrentReleaseIsRequired , opts .currentReleaseIsRequired )
170183 }
171184 })
172185 }
173186}
174187
175188func TestHandlePendingReleases (t * testing.T ) {
176189 tests := []struct {
177- name string
178- pendingReleases []replicatedapi.ChannelRelease
179- currentSequence int64
180- targetSequence int64
181- expectedReleases []string
190+ name string
191+ pendingReleases []replicatedapi.ChannelRelease
192+ currentSequence int64
193+ targetSequence int64
194+ expectedReleases []string
195+ expectedCurrentReleaseIsRequired bool
182196 }{
183197 {
184198 name : "no required releases" ,
@@ -252,6 +266,29 @@ func TestHandlePendingReleases(t *testing.T) {
252266 targetSequence : 100 ,
253267 expectedReleases : []string {},
254268 },
269+ {
270+ name : "current sequence is required" ,
271+ pendingReleases : []replicatedapi.ChannelRelease {
272+ {ChannelSequence : 99 , VersionLabel : "1.0.0" , IsRequired : true },
273+ },
274+ currentSequence : 99 ,
275+ targetSequence : 100 ,
276+ expectedReleases : []string {},
277+ expectedCurrentReleaseIsRequired : true ,
278+ },
279+ {
280+ name : "current sequence is required and there's other required releases" ,
281+ pendingReleases : []replicatedapi.ChannelRelease {
282+ {ChannelSequence : 99 , VersionLabel : "1.0.0" , IsRequired : true },
283+ {ChannelSequence : 101 , VersionLabel : "1.1.0" , IsRequired : true },
284+ {ChannelSequence : 102 , VersionLabel : "1.2.0" , IsRequired : false },
285+ {ChannelSequence : 103 , VersionLabel : "1.3.0" , IsRequired : true },
286+ },
287+ currentSequence : 99 ,
288+ targetSequence : 104 ,
289+ expectedReleases : []string {"1.1.0" , "1.3.0" },
290+ expectedCurrentReleaseIsRequired : true ,
291+ },
255292 }
256293
257294 for _ , tt := range tests {
@@ -268,6 +305,7 @@ func TestHandlePendingReleases(t *testing.T) {
268305 } else {
269306 assert .Equal (t , tt .expectedReleases , opts .requiredReleases )
270307 }
308+ assert .Equal (t , tt .expectedCurrentReleaseIsRequired , opts .currentReleaseIsRequired )
271309 })
272310 }
273311}
@@ -399,6 +437,40 @@ func TestValidateIsReleaseUpgradable(t *testing.T) {
399437 expectError : true ,
400438 expectValidationErr : true ,
401439 },
440+ {
441+ name : "current release failed and is required" ,
442+ opts : UpgradableOptions {
443+ CurrentAppVersion : "1.0.0" ,
444+ CurrentAppSequence : 100 ,
445+ CurrentAppStatus : "failed" ,
446+ CurrentECVersion : "2.0.0+k8s-1.29" ,
447+ TargetAppVersion : "1.5.0" ,
448+ TargetAppSequence : 500 ,
449+ TargetECVersion : "2.1.0+k8s-1.29" ,
450+ License : newTestLicense (true ),
451+ requiredReleases : []string {},
452+ currentReleaseIsRequired : true ,
453+ },
454+ expectError : true ,
455+ expectValidationErr : true ,
456+ },
457+ {
458+ name : "current release failed and is deployed" ,
459+ opts : UpgradableOptions {
460+ CurrentAppVersion : "1.0.0" ,
461+ CurrentAppSequence : 100 ,
462+ CurrentAppStatus : "deployed" ,
463+ CurrentECVersion : "2.0.0+k8s-1.29" ,
464+ TargetAppVersion : "1.5.0" ,
465+ TargetAppSequence : 500 ,
466+ TargetECVersion : "2.1.0+k8s-1.29" ,
467+ License : newTestLicense (true ),
468+ requiredReleases : []string {},
469+ currentReleaseIsRequired : true ,
470+ },
471+ expectError : false ,
472+ expectValidationErr : false ,
473+ },
402474 {
403475 name : "ec version downgrade" ,
404476 opts : UpgradableOptions {
0 commit comments