Skip to content

Commit aa9b8f3

Browse files
brileyyyyipaqsa
authored andcommitted
[chore] virtual chart file for helm
Signed-off-by: Stepan Paksashvili <stepan.paksashvili@flant.com>
1 parent e1aafa2 commit aa9b8f3

File tree

7 files changed

+140
-52
lines changed

7 files changed

+140
-52
lines changed

pkg/helm/client/client.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package client
22

33
import (
4+
"helm.sh/helm/v3/pkg/chart"
5+
46
"github.com/flant/addon-operator/pkg/utils"
57
)
68

79
type HelmClient interface {
810
LastReleaseStatus(releaseName string) (string, string, error)
9-
UpgradeRelease(releaseName string, chart string, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string) error
10-
Render(releaseName string, chart string, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string, debug bool) (string, error)
11+
UpgradeRelease(releaseName string, chart *chart.Chart, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string) error
12+
Render(releaseName string, chart *chart.Chart, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string, debug bool) (string, error)
1113
GetReleaseValues(releaseName string) (utils.Values, error)
1214
GetReleaseChecksum(releaseName string) (string, error)
1315
GetReleaseLabels(releaseName, labelName string) (string, error)

pkg/helm/helm3lib/helm3lib.go

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"github.com/deckhouse/deckhouse/pkg/log"
1515
logContext "github.com/deckhouse/deckhouse/pkg/log/context"
1616
"helm.sh/helm/v3/pkg/action"
17-
"helm.sh/helm/v3/pkg/chart/loader"
17+
"helm.sh/helm/v3/pkg/chart"
1818
"helm.sh/helm/v3/pkg/chartutil"
1919
"helm.sh/helm/v3/pkg/cli"
2020
"helm.sh/helm/v3/pkg/release"
@@ -164,15 +164,15 @@ func (h *LibClient) LastReleaseStatus(releaseName string) (string /*revision*/,
164164
return strconv.FormatInt(int64(lastRelease.Version), 10), lastRelease.Info.Status.String(), nil
165165
}
166166

167-
func (h *LibClient) UpgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
168-
err := h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, labels, namespace)
167+
func (h *LibClient) UpgradeRelease(releaseName string, chart *chart.Chart, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
168+
err := h.upgradeRelease(releaseName, chart, valuesPaths, setValues, labels, namespace)
169169
if err != nil {
170170
// helm validation can fail because FeatureGate was enabled for example
171171
// handling this case we can reinitialize kubeClient and repeat one more time by backoff
172172
if err := actionConfigInit(h.Logger); err != nil {
173173
return err
174174
}
175-
return h.upgradeRelease(releaseName, chartName, valuesPaths, setValues, labels, namespace)
175+
return h.upgradeRelease(releaseName, chart, valuesPaths, setValues, labels, namespace)
176176
}
177177
h.Logger.Debug("helm release upgraded", slog.String("version", releaseName))
178178
return nil
@@ -182,7 +182,7 @@ func (h *LibClient) hasLabelsToApply() bool {
182182
return len(h.labels) > 0
183183
}
184184

185-
func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
185+
func (h *LibClient) upgradeRelease(releaseName string, chart *chart.Chart, valuesPaths []string, setValues []string, labels map[string]string, namespace string) error {
186186
upg := action.NewUpgrade(actionConfig)
187187
if namespace != "" {
188188
upg.Namespace = namespace
@@ -197,11 +197,6 @@ func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesP
197197
upg.Timeout = options.Timeout
198198
upg.Labels = labels
199199

200-
chart, err := loader.Load(chartName)
201-
if err != nil {
202-
return err
203-
}
204-
205200
var resultValues chartutil.Values
206201

207202
for _, vp := range valuesPaths {
@@ -226,7 +221,7 @@ func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesP
226221

227222
h.Logger.Info("Running helm upgrade for release",
228223
slog.String("release", releaseName),
229-
slog.String("chart", chartName),
224+
slog.String("chart", chart.Metadata.Name),
230225
slog.String("namespace", namespace))
231226
histClient := action.NewHistory(actionConfig)
232227
// Max is not working!!! Sort the final of releases by your own
@@ -312,7 +307,7 @@ func (h *LibClient) upgradeRelease(releaseName string, chartName string, valuesP
312307
}
313308
h.Logger.Info("Helm upgrade successful",
314309
slog.String("release", releaseName),
315-
slog.String("chart", chartName),
310+
slog.String("chart", chart.Metadata.Name),
316311
slog.String("namespace", namespace))
317312

318313
return nil
@@ -451,12 +446,7 @@ func (h *LibClient) ListReleasesNames() ([]string, error) {
451446
return releases, nil
452447
}
453448

454-
func (h *LibClient) Render(releaseName, chartName string, valuesPaths, setValues []string, _ map[string]string, namespace string, debug bool) (string, error) {
455-
chart, err := loader.Load(chartName)
456-
if err != nil {
457-
return "", err
458-
}
459-
449+
func (h *LibClient) Render(releaseName string, chart *chart.Chart, valuesPaths, setValues []string, _ map[string]string, namespace string, debug bool) (string, error) {
460450
var resultValues chartutil.Values
461451

462452
for _, vp := range valuesPaths {
@@ -480,7 +470,7 @@ func (h *LibClient) Render(releaseName, chartName string, valuesPaths, setValues
480470
}
481471

482472
h.Logger.Debug("Render helm templates for chart ...",
483-
slog.String("chart", chartName),
473+
slog.String("chart", chart.Metadata.Name),
484474
slog.String("namespace", namespace))
485475

486476
inst := h.newDryRunInstAction(namespace, releaseName)
@@ -506,7 +496,7 @@ func (h *LibClient) Render(releaseName, chartName string, valuesPaths, setValues
506496
rs.Manifest += fmt.Sprintf("\n\n\n%v", err)
507497
}
508498

509-
h.Logger.Info("Render helm templates for chart was successful", slog.String("chart", chartName))
499+
h.Logger.Info("Render helm templates for chart was successful", slog.String("chart", chart.Metadata.Name))
510500

511501
return rs.Manifest, nil
512502
}

pkg/helm/helm3lib/helm3lib_test.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/deckhouse/deckhouse/pkg/log"
88
. "github.com/onsi/gomega"
99
"helm.sh/helm/v3/pkg/action"
10+
"helm.sh/helm/v3/pkg/chart/loader"
1011
"helm.sh/helm/v3/pkg/chartutil"
1112
"helm.sh/helm/v3/pkg/cli"
1213
kubefake "helm.sh/helm/v3/pkg/kube/fake"
@@ -47,7 +48,10 @@ func TestHelm3LibUpgradeDelete(t *testing.T) {
4748
g.Expect(err).ShouldNot(HaveOccurred())
4849
g.Expect(releases).To(BeEmpty(), "should get empty list of releases")
4950

50-
err = cl.UpgradeRelease("test-release", "testdata/chart", nil, nil, map[string]string{"key": "value"}, cl.Namespace)
51+
chart, err := loader.Load("testdata/chart")
52+
g.Expect(err).ShouldNot(HaveOccurred())
53+
54+
err = cl.UpgradeRelease("test-release", chart, nil, nil, map[string]string{"key": "value"}, cl.Namespace)
5155
g.Expect(err).ShouldNot(HaveOccurred())
5256

5357
releasesNames, err := cl.ListReleasesNames()
@@ -91,7 +95,10 @@ func TestReleaseExistsReturnsTrueForExistingRelease(t *testing.T) {
9195
g.Expect(err).ShouldNot(HaveOccurred())
9296
g.Expect(releases).To(BeEmpty(), "should get empty list of releases")
9397

94-
err = cl.UpgradeRelease("existing-release", "testdata/chart", nil, nil, nil, cl.Namespace)
98+
chart, err := loader.Load("testdata/chart")
99+
g.Expect(err).ShouldNot(HaveOccurred())
100+
101+
err = cl.UpgradeRelease("existing-release", chart, nil, nil, nil, cl.Namespace)
95102
g.Expect(err).ShouldNot(HaveOccurred())
96103

97104
releases, err = cl.ListReleases()
@@ -129,7 +136,10 @@ func TestDeleteReleaseRemovesExistingRelease(t *testing.T) {
129136
g.Expect(err).ShouldNot(HaveOccurred())
130137
g.Expect(releases).To(BeEmpty(), "should get empty list of releases")
131138

132-
err = cl.UpgradeRelease("release-to-delete", "testdata/chart", nil, nil, nil, cl.Namespace)
139+
chart, err := loader.Load("testdata/chart")
140+
g.Expect(err).ShouldNot(HaveOccurred())
141+
142+
err = cl.UpgradeRelease("release-to-delete", chart, nil, nil, nil, cl.Namespace)
133143
g.Expect(err).ShouldNot(HaveOccurred())
134144

135145
releases, err = cl.ListReleases()
@@ -157,7 +167,10 @@ func TestLastReleaseStatusReturnsCorrectStatusForExistingRelease(t *testing.T) {
157167
g := NewWithT(t)
158168
cl := initHelmClient(t)
159169

160-
err := cl.UpgradeRelease("status-release", "testdata/chart", nil, nil, nil, cl.Namespace)
170+
chart, err := loader.Load("testdata/chart")
171+
g.Expect(err).ShouldNot(HaveOccurred())
172+
173+
err = cl.UpgradeRelease("status-release", chart, nil, nil, nil, cl.Namespace)
161174
g.Expect(err).ShouldNot(HaveOccurred())
162175

163176
revision, status, err := cl.LastReleaseStatus("status-release")

pkg/helm/helm_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/deckhouse/deckhouse/pkg/log"
88
. "github.com/onsi/gomega"
9+
"helm.sh/helm/v3/pkg/chart/loader"
910

1011
"github.com/flant/addon-operator/pkg/helm/helm3lib"
1112
"github.com/flant/addon-operator/pkg/helm/nelm"
@@ -51,7 +52,10 @@ func TestHelmFactory(t *testing.T) {
5152
g.Expect(err).ShouldNot(HaveOccurred())
5253
g.Expect(isExists).Should(BeFalse(), "should not found release in the empty cluster")
5354

54-
err = helmCl.UpgradeRelease("test-release", "helm3lib/testdata/chart", nil, nil, nil, namespace)
55+
chart, err := loader.Load("helm3lib/testdata/chart")
56+
g.Expect(err).ShouldNot(HaveOccurred())
57+
58+
err = helmCl.UpgradeRelease("test-release", chart, nil, nil, nil, namespace)
5559
g.Expect(err).ShouldNot(HaveOccurred())
5660

5761
releasesAfterUpgrade, err := helmCl.ListReleasesNames()

pkg/helm/nelm/nelm.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/deckhouse/deckhouse/pkg/log"
1616
"github.com/werf/nelm/pkg/action"
1717
nelmLog "github.com/werf/nelm/pkg/log"
18+
"helm.sh/helm/v3/pkg/chart"
1819
"helm.sh/helm/v3/pkg/cli"
1920
"k8s.io/cli-runtime/pkg/genericclioptions"
2021
"k8s.io/client-go/rest"
@@ -181,10 +182,10 @@ func (c *NelmClient) LastReleaseStatus(releaseName string) (string, string, erro
181182
return strconv.FormatInt(int64(releaseGetResult.Release.Revision), 10), releaseGetResult.Release.Status.String(), nil
182183
}
183184

184-
func (c *NelmClient) UpgradeRelease(releaseName, chartName string, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string) error {
185+
func (c *NelmClient) UpgradeRelease(releaseName string, chart *chart.Chart, valuesPaths []string, setValues []string, releaseLabels map[string]string, namespace string) error {
185186
logger := c.logger.With(
186187
slog.String("release_name", releaseName),
187-
slog.String("chart", chartName),
188+
slog.String("chart", chart.Metadata.Name),
188189
slog.String("namespace", namespace),
189190
)
190191

@@ -220,7 +221,7 @@ func (c *NelmClient) UpgradeRelease(releaseName, chartName string, valuesPaths [
220221
}
221222

222223
if err := c.actions.ReleaseInstall(context.TODO(), releaseName, namespace, action.ReleaseInstallOptions{
223-
Chart: chartName,
224+
Chart: chart.Metadata.Name, // TODO: This is a temporary fix - nelm needs chart path, not name
224225
ExtraLabels: c.labels,
225226
ExtraAnnotations: extraAnnotations,
226227
KubeContext: c.opts.KubeContext,
@@ -239,7 +240,7 @@ func (c *NelmClient) UpgradeRelease(releaseName, chartName string, valuesPaths [
239240

240241
logger.Info("Nelm upgrade successful",
241242
slog.String("release", releaseName),
242-
slog.String("chart", chartName),
243+
slog.String("chart", chart.Metadata.Name),
243244
slog.String("namespace", namespace))
244245

245246
return nil
@@ -360,9 +361,9 @@ func (c *NelmClient) ListReleasesNames() ([]string, error) {
360361
return releaseNames, nil
361362
}
362363

363-
func (c *NelmClient) Render(releaseName, chartName string, valuesPaths, setValues []string, releaseLabels map[string]string, namespace string, debug bool) (string, error) {
364+
func (c *NelmClient) Render(releaseName string, chart *chart.Chart, valuesPaths, setValues []string, releaseLabels map[string]string, namespace string, debug bool) (string, error) {
364365
c.logger.Debug("Render nelm templates for chart ...",
365-
slog.String("chart", chartName),
366+
slog.String("chart", chart.Metadata.Name),
366367
slog.String("namespace", namespace))
367368

368369
// Add client annotations
@@ -378,8 +379,8 @@ func (c *NelmClient) Render(releaseName, chartName string, valuesPaths, setValue
378379
}
379380

380381
chartRenderResult, err := c.actions.ChartRender(context.TODO(), action.ChartRenderOptions{
381-
OutputFilePath: "/dev/null", // No output file, we want to return the manifest as a string
382-
Chart: chartName,
382+
OutputFilePath: "/dev/null", // No output file, we want to return the manifest as a string
383+
Chart: chart.Metadata.Name, // TODO: This is a temporary fix - nelm needs chart path, not name
383384
ExtraLabels: c.labels,
384385
ExtraAnnotations: extraAnnotations,
385386
KubeContext: c.opts.KubeContext,
@@ -393,12 +394,12 @@ func (c *NelmClient) Render(releaseName, chartName string, valuesPaths, setValue
393394
})
394395
if err != nil {
395396
if !debug {
396-
return "", fmt.Errorf("render nelm chart %q: %w\n\nUse --debug flag to render out invalid YAML", chartName, err)
397+
return "", fmt.Errorf("render nelm chart %q: %w\n\nUse --debug flag to render out invalid YAML", chart.Metadata.Name, err)
397398
}
398-
return "", fmt.Errorf("render nelm chart %q: %w", chartName, err)
399+
return "", fmt.Errorf("render nelm chart %q: %w", chart.Metadata.Name, err)
399400
}
400401

401-
c.logger.Info("Render nelm templates for chart was successful", slog.String("chart", chartName))
402+
c.logger.Info("Render nelm templates for chart was successful", slog.String("chart", chart.Metadata.Name))
402403

403404
var result strings.Builder
404405
for _, resource := range chartRenderResult.Resources {

pkg/helm/test/mock/mock.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mock
22

33
import (
44
"github.com/deckhouse/deckhouse/pkg/log"
5+
"helm.sh/helm/v3/pkg/chart"
56

67
"github.com/flant/addon-operator/pkg/helm"
78
"github.com/flant/addon-operator/pkg/helm/client"
@@ -48,7 +49,7 @@ func (c *Client) GetReleaseChecksum(_ string) (string, error) {
4849
return "23857cb313d15f43960f4daa7013804e", nil
4950
}
5051

51-
func (c *Client) UpgradeRelease(_, _ string, _ []string, _ []string, _ map[string]string, _ string) error {
52+
func (c *Client) UpgradeRelease(_ string, _ *chart.Chart, _ []string, _ []string, _ map[string]string, _ string) error {
5253
c.UpgradeReleaseExecuted = true
5354
return nil
5455
}
@@ -58,7 +59,7 @@ func (c *Client) DeleteRelease(_ string) error {
5859
return nil
5960
}
6061

61-
func (c *Client) Render(_ string, _ string, _ []string, _ []string, _ map[string]string, _ string, _ bool) (string, error) {
62+
func (c *Client) Render(_ string, _ *chart.Chart, _ []string, _ []string, _ map[string]string, _ string, _ bool) (string, error) {
6263
return "", nil
6364
}
6465

0 commit comments

Comments
 (0)