Skip to content

Commit e5e15cf

Browse files
[helm] revert changes made to release equality comaprison
This PR reverts: 1. Revert release equality comparison logic ref: operator-framework#5042 2. Changes made to the updated logic which caused charts to upgrade constantly - ref: operator-framework#4937 Signed-off-by: varshaprasad96 <[email protected]>
1 parent 6351af5 commit e5e15cf

File tree

14 files changed

+14
-221
lines changed

14 files changed

+14
-221
lines changed

Diff for: internal/helm/release/manager.go

+14-41
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"
@@ -33,7 +32,6 @@ import (
3332
"helm.sh/helm/v3/pkg/storage/driver"
3433
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3534
apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
36-
apiequality "k8s.io/apimachinery/pkg/api/equality"
3735
apierrors "k8s.io/apimachinery/pkg/api/errors"
3836
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3937
"k8s.io/apimachinery/pkg/runtime"
@@ -127,9 +125,13 @@ func (m *manager) Sync(ctx context.Context) error {
127125
m.deployedRelease = deployedRelease
128126
m.isInstalled = true
129127

130-
m.isUpgradeRequired, err = m.isUpgrade(deployedRelease)
128+
// Get the next candidate release to determine if an upgrade is necessary.
129+
candidateRelease, err := m.getCandidateRelease(m.namespace, m.releaseName, m.chart, m.values)
131130
if err != nil {
132-
return fmt.Errorf("failed to get upgrade status: %w", err)
131+
return fmt.Errorf("failed to get candidate release: %w", err)
132+
}
133+
if deployedRelease.Manifest != candidateRelease.Manifest {
134+
m.isUpgradeRequired = true
133135
}
134136
return nil
135137
}
@@ -138,43 +140,6 @@ func notFoundErr(err error) bool {
138140
return err != nil && strings.Contains(err.Error(), "not found")
139141
}
140142

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
157-
}
158-
159-
func (m manager) isUpgrade(deployedRelease *rpb.Release) (bool, error) {
160-
if deployedRelease == nil {
161-
return false, nil
162-
}
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)
169-
if err != nil {
170-
return false, err
171-
}
172-
skip = skip && ok
173-
174-
ok, err = equalJSONStruct(m.values, deployedRelease.Config)
175-
return !(skip && ok), err
176-
}
177-
178143
func (m manager) getDeployedRelease() (*rpb.Release, error) {
179144
deployedRelease, err := m.storageBackend.Deployed(m.releaseName)
180145
if err != nil {
@@ -186,6 +151,14 @@ func (m manager) getDeployedRelease() (*rpb.Release, error) {
186151
return deployedRelease, nil
187152
}
188153

154+
func (m manager) getCandidateRelease(namespace, name string, chart *cpb.Chart,
155+
values map[string]interface{}) (*rpb.Release, error) {
156+
upgrade := action.NewUpgrade(m.actionConfig)
157+
upgrade.Namespace = namespace
158+
upgrade.DryRun = true
159+
return upgrade.Run(name, chart, values)
160+
}
161+
189162
// InstallRelease performs a Helm release install.
190163
func (m manager) InstallRelease(ctx context.Context, opts ...InstallOption) (*rpb.Release, error) {
191164
install := action.NewInstall(m.actionConfig)

Diff for: internal/helm/release/manager_test.go

-87
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-
}

Diff for: internal/helm/release/testdata/simple/.helmignore

-21
This file was deleted.

Diff for: internal/helm/release/testdata/simple/Chart.yaml

-8
This file was deleted.

Diff for: internal/helm/release/testdata/simple/templates/NOTES.txt

-1
This file was deleted.

Diff for: internal/helm/release/testdata/simple/templates/_helpers.tpl

-7
This file was deleted.

Diff for: internal/helm/release/testdata/simple/templates/secrets.yaml

-8
This file was deleted.

Diff for: internal/helm/release/testdata/simple/values.yaml

-1
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/.helmignore

-21
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/Chart.yaml

-8
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/templates/NOTES.txt

-1
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/templates/_helpers.tpl

-7
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/templates/secrets.yaml

-8
This file was deleted.

Diff for: internal/helm/release/testdata/simpledf/values.yaml

-2
This file was deleted.

0 commit comments

Comments
 (0)