77 "encoding/json"
88
99 "github.com/onsi/gomega/gbytes"
10- "sigs.k8s.io/controller-runtime/pkg/client"
1110
1211 clihelper "github.com/rancher/fleet/integrationtests/cli"
1312 "github.com/rancher/fleet/integrationtests/utils"
@@ -16,7 +15,6 @@ import (
1615 corev1 "k8s.io/api/core/v1"
1716 apierrors "k8s.io/apimachinery/pkg/api/errors"
1817 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
19- "k8s.io/apimachinery/pkg/labels"
2018 "k8s.io/apimachinery/pkg/types"
2119
2220 . "github.com/onsi/ginkgo/v2"
@@ -156,205 +154,31 @@ var _ = Describe("Fleet CLI Deploy", func() {
156154
157155 When ("deploying on top of a release in `pending-install` status" , func () {
158156 BeforeEach (func () {
159- // Create release v1 (deployed)
160- releaseV1 := map [string ]interface {}{
161- "name" : "testbundle-simple-chart" ,
162- "version" : 1 ,
163- "namespace" : namespace ,
164- "info" : map [string ]interface {}{
165- "status" : "deployed" ,
166- },
167- "chart" : map [string ]interface {}{
168- "metadata" : map [string ]interface {}{
169- "name" : "testbundle-simple-chart" ,
170- "version" : "0.1.0" ,
171- },
172- },
173- "config" : map [string ]interface {}{},
174- "manifest" : "" ,
175- "labels" : map [string ]string {},
176- }
177- releaseV1JSON , err := json .Marshal (releaseV1 )
178- Expect (err ).ToNot (HaveOccurred ())
179-
180- var gzBufV1 bytes.Buffer
181- gzWriterV1 := gzip .NewWriter (& gzBufV1 )
182- _ , err = gzWriterV1 .Write (releaseV1JSON )
183- Expect (err ).ToNot (HaveOccurred ())
184- Expect (gzWriterV1 .Close ()).ToNot (HaveOccurred ())
185-
186- relV1 := make ([]byte , base64 .StdEncoding .EncodedLen (gzBufV1 .Len ()))
187- base64 .StdEncoding .Encode (relV1 , gzBufV1 .Bytes ())
188-
189- releaseSecretV1 := corev1.Secret {
190- ObjectMeta : metav1.ObjectMeta {
191- Name : "sh.helm.release.v1.testbundle-simple-chart.v1" ,
192- Namespace : namespace ,
193- Labels : map [string ]string {
194- "name" : "testbundle-simple-chart" ,
195- "owner" : "helm" ,
196- "status" : "deployed" ,
197- "version" : "1" ,
198- },
199- },
200- Type : "helm.sh/release.v1" ,
201- Data : map [string ][]byte {"release" : relV1 },
202- }
203-
204- // Create release v2 (pending-install)
205- releaseV2 := map [string ]interface {}{
206- "name" : "testbundle-simple-chart" ,
207- "version" : 2 ,
208- "namespace" : namespace ,
209- "info" : map [string ]interface {}{
157+ release := map [string ]interface {}{
158+ "name" : "testbundle-simple-chart" ,
159+ "info" : map [string ]string {
210160 "status" : "pending-install" ,
211161 },
212- "chart" : map [string ]interface {}{
213- "metadata" : map [string ]interface {}{
214- "name" : "testbundle-simple-chart" ,
215- "version" : "0.1.0" ,
216- },
217- },
218- "config" : map [string ]interface {}{},
219- "manifest" : "" ,
220- "labels" : map [string ]string {},
162+ // Other release fields (e.g. chart, manifests) omitted for simplicity, not needed to
163+ // check for a `pending-install` release.
221164 }
222- releaseV2JSON , err := json .Marshal (releaseV2 )
165+ releaseJSON , err := json .Marshal (release )
223166 Expect (err ).ToNot (HaveOccurred ())
224167
225- var gzBufV2 bytes.Buffer
226- gzWriterV2 := gzip .NewWriter (& gzBufV2 )
227- _ , err = gzWriterV2 .Write (releaseV2JSON )
228- Expect (err ).ToNot (HaveOccurred ())
229- Expect (gzWriterV2 .Close ()).ToNot (HaveOccurred ())
230-
231- relV2 := make ([]byte , base64 .StdEncoding .EncodedLen (gzBufV2 .Len ()))
232- base64 .StdEncoding .Encode (relV2 , gzBufV2 .Bytes ())
233-
234- releaseSecretV2 := corev1.Secret {
235- ObjectMeta : metav1.ObjectMeta {
236- Name : "sh.helm.release.v1.testbundle-simple-chart.v2" ,
237- Namespace : namespace ,
238- Labels : map [string ]string {
239- "name" : "testbundle-simple-chart" ,
240- "owner" : "helm" ,
241- "status" : "pending-install" ,
242- "version" : "2" ,
243- },
244- },
245- Type : "helm.sh/release.v1" ,
246- Data : map [string ][]byte {"release" : relV2 },
247- }
248-
249- Expect (k8sClient .Create (ctx , & releaseSecretV1 )).ToNot (HaveOccurred ())
250- Expect (k8sClient .Create (ctx , & releaseSecretV2 )).ToNot (HaveOccurred ())
251-
252- // check that the secret was created using List with a label selector
253- // that uses owner=helm and name=testbundle-simple-chart
254- Eventually (func (g Gomega ) {
255- secrets := & corev1.SecretList {}
256- err := k8sClient .List (ctx , secrets , & client.ListOptions {
257- Namespace : namespace ,
258- LabelSelector : labels .SelectorFromSet (map [string ]string {
259- "name" : "testbundle-simple-chart" ,
260- "owner" : "helm" ,
261- }),
262- })
263- g .Expect (err ).ToNot (HaveOccurred ())
264- g .Expect (len (secrets .Items )).To (BeNumerically (">=" , 2 ))
265- }, "5s" , "500ms" ).Should (Succeed ())
266-
267- args = []string {
268- "--input-file" , clihelper .AssetsPath + "bundledeployment/bd.yaml" ,
269- "--namespace" , namespace ,
270- }
271-
272- DeferCleanup (func () {
273- err := k8sClient .Delete (ctx , & releaseSecretV1 )
274- if err != nil && ! apierrors .IsNotFound (err ) {
275- Expect (err ).ToNot (HaveOccurred ())
276- }
277- err = k8sClient .Delete (ctx , & releaseSecretV2 )
278- if err != nil && ! apierrors .IsNotFound (err ) {
279- Expect (err ).ToNot (HaveOccurred ())
280- }
281- })
282- })
283-
284- It ("upgrades an orphaned pending-install release while preserving history" , func () {
285- buf , err := act (args )
286- Expect (err ).NotTo (HaveOccurred ())
287-
288- By ("creating resources" )
289- Expect (buf ).To (gbytes .Say ("- apiVersion: v1" ))
290- Expect (buf ).To (gbytes .Say (" data:" ))
291- Expect (buf ).To (gbytes .Say (" name: example-value" ))
292-
293- cm := & corev1.ConfigMap {}
294- err = k8sClient .Get (ctx , types.NamespacedName {Namespace : namespace , Name : "test-simple-chart-config" }, cm )
295- Expect (err ).NotTo (HaveOccurred ())
296-
297- By ("verifying the release was upgraded (not deleted and reinstalled)" )
298- secrets := & corev1.SecretList {}
299- err = k8sClient .List (ctx , secrets , & client.ListOptions {
300- Namespace : namespace ,
301- LabelSelector : labels .SelectorFromSet (map [string ]string {
302- "name" : "testbundle-simple-chart" ,
303- "owner" : "helm" ,
304- }),
305- })
306- Expect (err ).NotTo (HaveOccurred ())
307- // Should have v1 (original pending-install) + v2 (successful upgrade)
308- Expect (len (secrets .Items )).To (BeNumerically (">=" , 2 ))
309-
310- // Verify the latest release is deployed
311- var latestVersion int
312- for _ , secret := range secrets .Items {
313- if secret .Labels ["status" ] == "deployed" {
314- latestVersion ++
315- }
316- }
317- Expect (latestVersion ).To (Equal (1 ), "should have exactly one deployed release" )
318- })
319- })
320-
321- When ("deploying on top of a release in `pending-install` status with no previous version" , func () {
322- BeforeEach (func () {
323- // Create ONLY release v1 (pending-install) - no v0 deployed version exists
324- // This simulates a failed initial install or lost history scenario
325- releaseV1 := map [string ]interface {}{
326- "name" : "testbundle-simple-chart" ,
327- "version" : 1 ,
328- "namespace" : namespace ,
329- "info" : map [string ]interface {}{
330- "status" : "pending-install" ,
331- },
332- "chart" : map [string ]interface {}{
333- "metadata" : map [string ]interface {}{
334- "name" : "testbundle-simple-chart" ,
335- "version" : "0.1.0" ,
336- },
337- },
338- "config" : map [string ]interface {}{},
339- "manifest" : "" ,
340- "labels" : map [string ]string {},
341- }
342- releaseV1JSON , err := json .Marshal (releaseV1 )
168+ var gzBuf bytes.Buffer
169+ gzWriter := gzip .NewWriter (& gzBuf )
170+ _ , err = gzWriter .Write (releaseJSON )
343171 Expect (err ).ToNot (HaveOccurred ())
344172
345- var gzBufV1 bytes.Buffer
346- gzWriterV1 := gzip .NewWriter (& gzBufV1 )
347- _ , err = gzWriterV1 .Write (releaseV1JSON )
348- Expect (err ).ToNot (HaveOccurred ())
349- Expect (gzWriterV1 .Close ()).ToNot (HaveOccurred ())
173+ Expect (gzWriter .Close ()).ToNot (HaveOccurred ())
350174
351- relV1 := make ([]byte , base64 .StdEncoding .EncodedLen (gzBufV1 .Len ()))
352- base64 .StdEncoding .Encode (relV1 , gzBufV1 .Bytes ())
175+ rel := make ([]byte , base64 .StdEncoding .EncodedLen (gzBuf .Len ()))
176+ base64 .StdEncoding .Encode (rel , gzBuf .Bytes ())
353177
354- releaseSecretV1 := corev1.Secret {
178+ releaseSecret := corev1.Secret {
355179 ObjectMeta : metav1.ObjectMeta {
356180 Name : "sh.helm.release.v1.testbundle-simple-chart.v1" ,
357- Namespace : namespace ,
181+ Namespace : "default" ,
358182 Labels : map [string ]string {
359183 "name" : "testbundle-simple-chart" ,
360184 "owner" : "helm" ,
@@ -363,80 +187,22 @@ var _ = Describe("Fleet CLI Deploy", func() {
363187 },
364188 },
365189 Type : "helm.sh/release.v1" ,
366- Data : map [string ][]byte {"release" : relV1 },
190+ Data : map [string ][]byte {"release" : rel },
367191 }
368-
369- // Clean up any existing secrets from previous tests to prevent conflicts
370- // Previous tests might have created multiple versions (v1, v2, v3, etc.)
371- secrets := & corev1.SecretList {}
372- err = k8sClient .List (ctx , secrets , & client.ListOptions {
373- Namespace : namespace ,
374- LabelSelector : labels .SelectorFromSet (map [string ]string {
375- "name" : "testbundle-simple-chart" ,
376- "owner" : "helm" ,
377- }),
378- })
379- Expect (err ).ToNot (HaveOccurred ())
380- for _ , secret := range secrets .Items {
381- _ = k8sClient .Delete (ctx , & secret )
382- }
383-
384- // Wait for all secrets to be deleted before creating the new one
385- Eventually (func (g Gomega ) {
386- secrets := & corev1.SecretList {}
387- err := k8sClient .List (ctx , secrets , & client.ListOptions {
388- Namespace : namespace ,
389- LabelSelector : labels .SelectorFromSet (map [string ]string {
390- "name" : "testbundle-simple-chart" ,
391- "owner" : "helm" ,
392- }),
393- })
394- g .Expect (err ).ToNot (HaveOccurred ())
395- g .Expect (secrets .Items ).To (BeEmpty ())
396- }, "5s" , "500ms" ).Should (Succeed ())
397-
398- // Create only the pending-install secret
399- Expect (k8sClient .Create (ctx , & releaseSecretV1 )).ToNot (HaveOccurred ())
400-
401- // Verify the secret was created
402- Eventually (func (g Gomega ) {
403- secrets := & corev1.SecretList {}
404- err := k8sClient .List (ctx , secrets , & client.ListOptions {
405- Namespace : namespace ,
406- LabelSelector : labels .SelectorFromSet (map [string ]string {
407- "name" : "testbundle-simple-chart" ,
408- "owner" : "helm" ,
409- }),
410- })
411- g .Expect (err ).ToNot (HaveOccurred ())
412- g .Expect (secrets .Items ).To (HaveLen (1 ))
413- }, "5s" , "500ms" ).Should (Succeed ())
414-
192+ // Fleet creates release secrets into the default namespace, therefore a cleanup is needed here
193+ // to prevent conflicts with other test cases.
194+ _ = k8sClient .Delete (ctx , & releaseSecret )
195+ Expect (k8sClient .Create (ctx , & releaseSecret )).ToNot (HaveOccurred ())
415196 args = []string {
416197 "--input-file" , clihelper .AssetsPath + "bundledeployment/bd.yaml" ,
417198 "--namespace" , namespace ,
418199 }
419-
420200 DeferCleanup (func () {
421- // Clean up all helm release secrets created during this test
422- secrets := & corev1.SecretList {}
423- err := k8sClient .List (ctx , secrets , & client.ListOptions {
424- Namespace : namespace ,
425- LabelSelector : labels .SelectorFromSet (map [string ]string {
426- "name" : "testbundle-simple-chart" ,
427- "owner" : "helm" ,
428- }),
429- })
430- if err != nil && ! apierrors .IsNotFound (err ) {
431- Expect (err ).ToNot (HaveOccurred ())
432- }
433- for _ , secret := range secrets .Items {
434- _ = k8sClient .Delete (ctx , & secret )
435- }
201+ Expect (k8sClient .Delete (ctx , & releaseSecret )).ToNot (HaveOccurred ())
436202 })
437203 })
438204
439- It ("upgrades an orphaned pending-install release while preserving history " , func () {
205+ It ("installs the release successfully " , func () {
440206 buf , err := act (args )
441207 Expect (err ).NotTo (HaveOccurred ())
442208
@@ -448,28 +214,6 @@ var _ = Describe("Fleet CLI Deploy", func() {
448214 cm := & corev1.ConfigMap {}
449215 err = k8sClient .Get (ctx , types.NamespacedName {Namespace : namespace , Name : "test-simple-chart-config" }, cm )
450216 Expect (err ).NotTo (HaveOccurred ())
451-
452- By ("verifying the release was upgraded (not deleted and reinstalled)" )
453- secrets := & corev1.SecretList {}
454- err = k8sClient .List (ctx , secrets , & client.ListOptions {
455- Namespace : namespace ,
456- LabelSelector : labels .SelectorFromSet (map [string ]string {
457- "name" : "testbundle-simple-chart" ,
458- "owner" : "helm" ,
459- }),
460- })
461- Expect (err ).NotTo (HaveOccurred ())
462- // Should have v1 (original pending-install) + v2 (successful upgrade)
463- Expect (len (secrets .Items )).To (BeNumerically (">=" , 2 ))
464-
465- // Verify the latest release is deployed
466- var latestVersion int
467- for _ , secret := range secrets .Items {
468- if secret .Labels ["status" ] == "deployed" {
469- latestVersion ++
470- }
471- }
472- Expect (latestVersion ).To (Equal (1 ), "should have exactly one deployed release" )
473217 })
474218 })
475219
0 commit comments