Skip to content

Commit a16ce91

Browse files
committed
fix:issue-5041
Signed-off-by: cndoit18 <[email protected]>
1 parent 2781cf8 commit a16ce91

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
entries:
2+
- description: >
3+
For Helm-based operators, fixed a bug where getting a new helm release revision for every reconciliation, even there are no changes at all.
4+
kind: bugfix

internal/helm/release/manager.go

+28-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import (
3232
"helm.sh/helm/v3/pkg/storage/driver"
3333
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3434
apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
35-
apiequality "k8s.io/apimachinery/pkg/api/equality"
3635
apierrors "k8s.io/apimachinery/pkg/api/errors"
3736
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3837
"k8s.io/apimachinery/pkg/runtime"
@@ -44,6 +43,7 @@ import (
4443

4544
"github.com/operator-framework/operator-sdk/internal/helm/internal/types"
4645
"github.com/operator-framework/operator-sdk/internal/helm/manifestutil"
46+
"k8s.io/apimachinery/pkg/conversion"
4747
)
4848

4949
// Manager manages a Helm release. It can install, upgrade, reconcile,
@@ -135,6 +135,30 @@ func notFoundErr(err error) bool {
135135
return err != nil && strings.Contains(err.Error(), "not found")
136136
}
137137

138+
var equalities = conversion.EqualitiesOrDie(func(a, b *cpb.Chart) bool {
139+
if a == nil || b == nil {
140+
return a == nil && b == nil
141+
}
142+
aencode := &bytes.Buffer{}
143+
bencode := &bytes.Buffer{}
144+
145+
_ = json.NewEncoder(aencode).Encode(a)
146+
_ = json.NewEncoder(bencode).Encode(b)
147+
148+
return aencode.String() == bencode.String()
149+
}, func(a, b map[string]interface{}) bool {
150+
if a == nil || b == nil {
151+
return a == nil && b == nil
152+
}
153+
aencode := &bytes.Buffer{}
154+
bencode := &bytes.Buffer{}
155+
156+
_ = json.NewEncoder(aencode).Encode(a)
157+
_ = json.NewEncoder(bencode).Encode(b)
158+
159+
return aencode.String() == bencode.String()
160+
})
161+
138162
func (m manager) isUpgrade(deployedRelease *rpb.Release) bool {
139163
if deployedRelease == nil {
140164
return false
@@ -143,8 +167,9 @@ func (m manager) isUpgrade(deployedRelease *rpb.Release) bool {
143167
// Judging whether to skip updates
144168
skip := m.namespace == deployedRelease.Namespace
145169
skip = skip && m.releaseName == deployedRelease.Name
146-
skip = skip && apiequality.Semantic.DeepEqual(m.chart, deployedRelease.Chart)
147-
skip = skip && apiequality.Semantic.DeepEqual(m.values, deployedRelease.Config)
170+
171+
skip = skip && equalities.DeepEqual(m.chart, deployedRelease.Chart)
172+
skip = skip && equalities.DeepEqual(m.values, deployedRelease.Config)
148173

149174
return !skip
150175
}

internal/helm/release/manager_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
package release
1616

1717
import (
18+
"bytes"
19+
"encoding/json"
1820
"testing"
1921

2022
"github.com/stretchr/testify/assert"
@@ -277,9 +279,12 @@ func newTestRelease(chart *cpb.Chart, values map[string]interface{}, name, names
277279
release := rpb.Mock(&rpb.MockReleaseOptions{
278280
Name: name,
279281
Namespace: namespace,
280-
Chart: chart,
281282
Version: 1,
282283
})
284+
285+
buffer := &bytes.Buffer{}
286+
_ = json.NewEncoder(buffer).Encode(chart)
287+
_ = json.NewDecoder(buffer).Decode(release.Chart)
283288
release.Config = values
284289
return release
285290
}

0 commit comments

Comments
 (0)