Skip to content

Commit 7c2c7e3

Browse files
authored
Revert "Avoid uninstalling releases in PendingInstall status (#4647) (#4679)
Because of the regressiondescribed in #4673 This reverts commit 64757cd.
1 parent e3e12a9 commit 7c2c7e3

File tree

2 files changed

+22
-397
lines changed

2 files changed

+22
-397
lines changed

integrationtests/cli/deploy/deploy_test.go

Lines changed: 21 additions & 277 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
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

Comments
 (0)