Skip to content

Commit 173c6cd

Browse files
authored
feat: add GetReleaseChecksum method and update UpgradeRelease signature (#583)
Signed-off-by: Evsyukov Denis <[email protected]>
1 parent fa0648a commit 173c6cd

File tree

7 files changed

+68
-28
lines changed

7 files changed

+68
-28
lines changed

pkg/helm/client/client.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package client
22

3-
import "github.com/flant/addon-operator/pkg/utils"
3+
import (
4+
"github.com/flant/addon-operator/pkg/utils"
5+
)
46

57
type HelmClient interface {
68
LastReleaseStatus(releaseName string) (string, string, error)
7-
UpgradeRelease(releaseName string, chart string, valuesPaths []string, setValues []string, namespace string) error
9+
UpgradeRelease(releaseName string, chart string, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error
810
Render(releaseName string, chart string, valuesPaths []string, setValues []string, namespace string, debug bool) (string, error)
911
GetReleaseValues(releaseName string) (utils.Values, error)
12+
GetReleaseChecksum(releaseName string) (string, error)
1013
DeleteRelease(releaseName string) error
1114
ListReleasesNames() ([]string, error)
1215
IsReleaseExists(releaseName string) (bool, error)

pkg/helm/helm3/helm3.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func (h *Helm3Client) LastReleaseStatus(releaseName string) (string /*revision*/
145145
return revision, status, nil
146146
}
147147

148-
func (h *Helm3Client) UpgradeRelease(releaseName string, chart string, valuesPaths []string, setValues []string, namespace string) error {
148+
func (h *Helm3Client) UpgradeRelease(releaseName string, chart string, valuesPaths []string, setValues []string, _ map[string]string, namespace string) error {
149149
args := []string{
150150
"upgrade", releaseName, chart,
151151
"--install",
@@ -210,6 +210,20 @@ func (h *Helm3Client) GetReleaseValues(releaseName string) (utils.Values, error)
210210
return values, nil
211211
}
212212

213+
func (h *Helm3Client) GetReleaseChecksum(releaseName string) (string, error) {
214+
args := []string{
215+
"get", "manifest", releaseName,
216+
"--namespace", h.Namespace,
217+
}
218+
stdout, stderr, err := h.cmd(args...)
219+
if err != nil {
220+
return "", fmt.Errorf("cannot get manifest of helm release %s: %s\n%s %s", releaseName, err, stdout, stderr)
221+
}
222+
223+
checksum := utils.CalculateStringsChecksum(stdout)
224+
return checksum, nil
225+
}
226+
213227
func (h *Helm3Client) DeleteRelease(releaseName string) error {
214228
h.Logger.Debug("helm release: execute helm uninstall", slog.String("release", releaseName))
215229

pkg/helm/helm3lib/helm3lib.go

+30-4
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,15 @@ func (h *LibClient) LastReleaseStatus(releaseName string) (string /*revision*/,
160160
return strconv.FormatInt(int64(lastRelease.Version), 10), lastRelease.Info.Status.String(), nil
161161
}
162162

163-
func (h *LibClient) UpgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, namespace string) error {
164-
err := h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, namespace)
163+
func (h *LibClient) UpgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
164+
err := h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, labels, namespace)
165165
if err != nil {
166166
// helm validation can fail because FeatureGate was enabled for example
167167
// handling this case we can reinitialize kubeClient and repeat one more time by backoff
168168
if err := actionConfigInit(h.Logger); err != nil {
169169
return err
170170
}
171-
return h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, namespace)
171+
return h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, labels, namespace)
172172
}
173173
h.Logger.Debug("helm release upgraded", slog.String("version", releaseName))
174174
return nil
@@ -178,7 +178,7 @@ func (h *LibClient) hasLabelsToApply() bool {
178178
return len(h.labels) > 0
179179
}
180180

181-
func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, namespace string) error {
181+
func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
182182
upg := action.NewUpgrade(actionConfig)
183183
if namespace != "" {
184184
upg.Namespace = namespace
@@ -191,6 +191,7 @@ func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesP
191191
upg.SkipCRDs = true
192192
upg.MaxHistory = int(options.HistoryMax)
193193
upg.Timeout = options.Timeout
194+
upg.Labels = labels
194195

195196
chart, err := loader.Load(chartName)
196197
if err != nil {
@@ -240,6 +241,7 @@ func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesP
240241
instClient.Timeout = options.Timeout
241242
instClient.ReleaseName = releaseName
242243
instClient.UseReleaseName = true
244+
instClient.Labels = labels
243245

244246
_, err = instClient.Run(chart, resultValues)
245247
return err
@@ -356,6 +358,30 @@ func (h *LibClient) GetReleaseValues(releaseName string) (utils.Values, error) {
356358
return gv.Run(releaseName)
357359
}
358360

361+
func (h *LibClient) GetReleaseChecksum(releaseName string) (string, error) {
362+
gv := action.NewGet(actionConfig)
363+
rel, err := gv.Run(releaseName)
364+
if err != nil {
365+
return "", fmt.Errorf("helm get failed: %s", err)
366+
}
367+
if checksum, ok := rel.Labels["moduleChecksum"]; ok {
368+
return checksum, nil
369+
}
370+
371+
// fallback to old behavior
372+
releaseValues, err := h.GetReleaseValues(releaseName)
373+
if err != nil {
374+
return "", fmt.Errorf("helm get failed: %s", err)
375+
}
376+
if recordedChecksum, hasKey := releaseValues["_addonOperatorModuleChecksum"]; hasKey {
377+
if recordedChecksumStr, ok := recordedChecksum.(string); ok {
378+
return recordedChecksumStr, nil
379+
}
380+
}
381+
382+
return "", fmt.Errorf("moduleChecksum label not found in release %s", releaseName)
383+
}
384+
359385
func (h *LibClient) DeleteRelease(releaseName string) error {
360386
h.Logger.Debug("helm release: execute helm uninstall", slog.String("release", releaseName))
361387

pkg/helm/helm3lib/helm3lib_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func TestHelm3LibUpgradeDelete(t *testing.T) {
3838

3939
cl := initHelmClient(t)
4040

41-
err := cl.UpgradeRelease("test-release", "testdata/chart", nil, nil, cl.Namespace)
41+
err := cl.UpgradeRelease("test-release", "testdata/chart", nil, nil, nil, cl.Namespace)
4242
g.Expect(err).ShouldNot(HaveOccurred())
4343

4444
releases, err := cl.ListReleasesNames()

pkg/helm/helm_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func TestHelmFactory(t *testing.T) {
5151
g.Expect(err).ShouldNot(HaveOccurred())
5252
g.Expect(isExists).Should(BeFalse(), "should not found release in the empty cluster")
5353

54-
err = helmCl.UpgradeRelease("test-release", "helm3lib/testdata/chart", nil, nil, namespace)
54+
err = helmCl.UpgradeRelease("test-release", "helm3lib/testdata/chart", nil, nil, nil, namespace)
5555
g.Expect(err).ShouldNot(HaveOccurred())
5656

5757
releasesAfterUpgrade, err := helmCl.ListReleasesNames()

pkg/helm/test/mock/mock.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ func (c *Client) GetReleaseValues(_ string) (utils.Values, error) {
4444
return make(utils.Values), nil
4545
}
4646

47-
func (c *Client) UpgradeRelease(_, _ string, _ []string, _ []string, _ string) error {
47+
func (c *Client) GetReleaseChecksum(_ string) (string, error) {
48+
return "23857cb313d15f43960f4daa7013804e", nil
49+
}
50+
51+
func (c *Client) UpgradeRelease(_, _ string, _ []string, _ []string, _ map[string]string, _ string) error {
4852
c.UpgradeReleaseExecuted = true
4953
return nil
5054
}

pkg/module_manager/models/modules/helm.go

+11-18
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,10 @@ func (hm *HelmModule) RunHelmInstall(logLabels map[string]string) error {
272272
helmReleaseName,
273273
hm.path,
274274
[]string{valuesPath},
275-
[]string{fmt.Sprintf("_addonOperatorModuleChecksum=%s", checksum)},
275+
[]string{},
276+
map[string]string{
277+
"moduleChecksum": checksum,
278+
},
276279
hm.defaultNamespace,
277280
)
278281
}()
@@ -311,32 +314,22 @@ func (hm *HelmModule) shouldRunHelmUpgrade(helmClient client.HelmClient, release
311314
}
312315

313316
// Get values for a non-failed release.
314-
releaseValues, err := helmClient.GetReleaseValues(releaseName)
317+
recordedChecksum, err := helmClient.GetReleaseChecksum(releaseName)
315318
if err != nil {
316319
logEntry.Debug("helm release get values error, no upgrade",
317320
slog.String("release", releaseName),
318321
log.Err(err))
319322
return false, err
320323
}
321324

322-
// Run helm upgrade if there is no stored checksum
323-
recordedChecksum, hasKey := releaseValues["_addonOperatorModuleChecksum"]
324-
if !hasKey {
325-
logEntry.Debug("helm release has no saved checksum of values: should run upgrade",
326-
slog.String("release", releaseName))
327-
return true, nil
328-
}
329-
330325
// Calculate a checksum of current values and compare to a stored checksum.
331326
// Run helm upgrade if checksum is changed.
332-
if recordedChecksumStr, ok := recordedChecksum.(string); ok {
333-
if recordedChecksumStr != checksum {
334-
logEntry.Debug("helm release checksum is changed: should run upgrade",
335-
slog.String("release", releaseName),
336-
slog.String("checksum", recordedChecksumStr),
337-
slog.String("newChecksum", checksum))
338-
return true, nil
339-
}
327+
if recordedChecksum != checksum {
328+
logEntry.Debug("helm release checksum is changed: should run upgrade",
329+
slog.String("release", releaseName),
330+
slog.String("checksum", recordedChecksum),
331+
slog.String("newChecksum", checksum))
332+
return true, nil
340333
}
341334

342335
// Check if there are absent resources

0 commit comments

Comments
 (0)