Skip to content

Commit aa1733a

Browse files
committed
fix(issue 5056): fix issue 5056
Signed-off-by: cndoit18 <[email protected]>
1 parent 57ac0fe commit aa1733a

File tree

14 files changed

+11
-207
lines changed

14 files changed

+11
-207
lines changed

internal/helm/release/manager.go

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"encoding/json"
2121
"errors"
2222
"fmt"
23-
"reflect"
2423
"strings"
2524

2625
jsonpatch "gomodules.xyz/jsonpatch/v3"
@@ -138,41 +137,26 @@ func notFoundErr(err error) bool {
138137
return err != nil && strings.Contains(err.Error(), "not found")
139138
}
140139

141-
// This is caused by the different logic of loading from local and loading from secret
142-
// For example, the Raw field, which has the tag `json:"-"`, causes the Unmarshal to be lost when it into Release
143-
// We need to make them follow the JSON tag
144-
// see: https://github.com/helm/helm/blob/cf0c6fed519d48101cd69ce01a355125215ee46f/pkg/storage/driver/util.go#L81
145-
func equalJSONStruct(a, b interface{}) (bool, error) {
146-
if reflect.ValueOf(a).IsNil() || reflect.ValueOf(b).IsNil() {
147-
return apiequality.Semantic.DeepEqual(a, b), nil
148-
}
149-
150-
aBuf, bBuf := &bytes.Buffer{}, &bytes.Buffer{}
151-
err := json.NewEncoder(aBuf).Encode(a)
152-
if err != nil {
153-
return false, err
154-
}
155-
err = json.NewEncoder(bBuf).Encode(b)
156-
return aBuf.String() == bBuf.String(), err
140+
func (m manager) getCandidateRelease(namespace, name string, chart *cpb.Chart,
141+
values map[string]interface{}) (*rpb.Release, error) {
142+
upgrade := action.NewUpgrade(m.actionConfig)
143+
upgrade.ReuseValues = true
144+
upgrade.Namespace = namespace
145+
upgrade.DryRun = true
146+
return upgrade.Run(name, chart, values)
157147
}
158148

159149
func (m manager) isUpgrade(deployedRelease *rpb.Release) (bool, error) {
160150
if deployedRelease == nil {
161151
return false, nil
162152
}
163-
164-
// Judging whether to skip updates
165-
skip := m.namespace == deployedRelease.Namespace
166-
skip = skip && m.releaseName == deployedRelease.Name
167-
168-
ok, err := equalJSONStruct(m.chart, deployedRelease.Chart)
153+
candidateRelease, err := m.getCandidateRelease(deployedRelease.Namespace, deployedRelease.Name, m.chart, m.values)
169154
if err != nil {
170155
return false, err
171156
}
172-
skip = skip && ok
173-
174-
ok, err = equalJSONStruct(m.values, deployedRelease.Config)
175-
return !(skip && ok), err
157+
skip := deployedRelease.Manifest == candidateRelease.Manifest
158+
skip = skip && apiequality.Semantic.DeepEqual(m.values, deployedRelease.Chart)
159+
return !skip, nil
176160
}
177161

178162
func (m manager) getDeployedRelease() (*rpb.Release, error) {

internal/helm/release/manager_test.go

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,9 @@
1515
package release
1616

1717
import (
18-
"bytes"
19-
"encoding/json"
2018
"testing"
2119

2220
"github.com/stretchr/testify/assert"
23-
cpb "helm.sh/helm/v3/pkg/chart"
24-
lpb "helm.sh/helm/v3/pkg/chart/loader"
25-
rpb "helm.sh/helm/v3/pkg/release"
2621
appsv1 "k8s.io/api/apps/v1"
2722
v1 "k8s.io/api/core/v1"
2823
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -216,85 +211,3 @@ func TestManagerGenerateStrategicMergePatch(t *testing.T) {
216211
assert.Equal(t, test.patch, string(diff))
217212
}
218213
}
219-
220-
func TestManagerisUpgrade(t *testing.T) {
221-
tests := []struct {
222-
name string
223-
releaseName string
224-
releaseNs string
225-
values map[string]interface{}
226-
chart *cpb.Chart
227-
deployedRelease *rpb.Release
228-
want bool
229-
}{
230-
{
231-
name: "ok",
232-
releaseName: "deployed",
233-
releaseNs: "deployed-ns",
234-
values: map[string]interface{}{"key": "value"},
235-
chart: newTestChart(t, "./testdata/simple"),
236-
deployedRelease: newTestRelease(newTestChart(t, "./testdata/simple"), map[string]interface{}{"key": "value"}, "deployed", "deployed-ns"),
237-
want: false,
238-
},
239-
{
240-
name: "different chart",
241-
releaseName: "deployed",
242-
releaseNs: "deployed-ns",
243-
values: map[string]interface{}{"key": "value"},
244-
chart: newTestChart(t, "./testdata/simple"),
245-
deployedRelease: newTestRelease(newTestChart(t, "./testdata/simpledf"), map[string]interface{}{"key": "value"}, "deployed", "deployed-ns"),
246-
want: true,
247-
},
248-
{
249-
name: "different values",
250-
releaseName: "deployed",
251-
releaseNs: "deployed-ns",
252-
values: map[string]interface{}{"key": "1", "int": int32(1)},
253-
chart: newTestChart(t, "./testdata/simple"),
254-
deployedRelease: newTestRelease(newTestChart(t, "./testdata/simple"), map[string]interface{}{"key": "", "int": int64(1)}, "deployed", "deployed-ns"),
255-
want: true,
256-
},
257-
{
258-
name: "nil values",
259-
releaseName: "deployed",
260-
releaseNs: "deployed-ns",
261-
values: nil,
262-
chart: newTestChart(t, "./testdata/simple"),
263-
deployedRelease: newTestRelease(newTestChart(t, "./testdata/simple"), map[string]interface{}{}, "deployed", "deployed-ns"),
264-
want: false,
265-
},
266-
}
267-
for _, test := range tests {
268-
t.Run(test.name, func(t *testing.T) {
269-
m := manager{
270-
releaseName: test.releaseName,
271-
namespace: test.releaseNs,
272-
values: test.values,
273-
chart: test.chart,
274-
}
275-
isUpgrade, err := m.isUpgrade(test.deployedRelease)
276-
assert.Equal(t, test.want, isUpgrade)
277-
assert.Equal(t, nil, err)
278-
})
279-
}
280-
}
281-
282-
func newTestChart(t *testing.T, path string) *cpb.Chart {
283-
chart, err := lpb.Load(path)
284-
assert.Nil(t, err)
285-
return chart
286-
}
287-
288-
func newTestRelease(chart *cpb.Chart, values map[string]interface{}, name, namespace string) *rpb.Release { // nolint: unparam
289-
release := rpb.Mock(&rpb.MockReleaseOptions{
290-
Name: name,
291-
Namespace: namespace,
292-
Version: 1,
293-
})
294-
295-
buffer := &bytes.Buffer{}
296-
_ = json.NewEncoder(buffer).Encode(chart)
297-
_ = json.NewDecoder(buffer).Decode(release.Chart)
298-
release.Config = values
299-
return release
300-
}

internal/helm/release/testdata/simple/.helmignore

Lines changed: 0 additions & 21 deletions
This file was deleted.

internal/helm/release/testdata/simple/Chart.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

internal/helm/release/testdata/simple/templates/NOTES.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/helm/release/testdata/simple/templates/_helpers.tpl

Lines changed: 0 additions & 7 deletions
This file was deleted.

internal/helm/release/testdata/simple/templates/secrets.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

internal/helm/release/testdata/simple/values.yaml

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/helm/release/testdata/simpledf/.helmignore

Lines changed: 0 additions & 21 deletions
This file was deleted.

internal/helm/release/testdata/simpledf/Chart.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

internal/helm/release/testdata/simpledf/templates/NOTES.txt

Lines changed: 0 additions & 1 deletion
This file was deleted.

internal/helm/release/testdata/simpledf/templates/_helpers.tpl

Lines changed: 0 additions & 7 deletions
This file was deleted.

internal/helm/release/testdata/simpledf/templates/secrets.yaml

Lines changed: 0 additions & 8 deletions
This file was deleted.

internal/helm/release/testdata/simpledf/values.yaml

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)