@@ -19,22 +19,23 @@ package util
19
19
import (
20
20
"compress/gzip"
21
21
"context"
22
+ "encoding/json"
22
23
"fmt"
24
+ dockerRegistryRepository "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry"
25
+ dirCopy "github.com/otiai10/copy"
26
+ "go.opentelemetry.io/otel"
27
+ "go.uber.org/zap"
28
+ "helm.sh/helm/v3/pkg/chart"
29
+ "helm.sh/helm/v3/pkg/chart/loader"
30
+ "helm.sh/helm/v3/pkg/chartutil"
23
31
"io/ioutil"
24
32
"math/rand"
25
33
"os"
26
34
"path/filepath"
35
+ "sigs.k8s.io/yaml"
27
36
"strconv"
28
37
"strings"
29
38
"time"
30
-
31
- dockerRegistryRepository "github.com/devtron-labs/devtron/internal/sql/repository/dockerRegistry"
32
- dirCopy "github.com/otiai10/copy"
33
- "go.opentelemetry.io/otel"
34
- "go.uber.org/zap"
35
- "k8s.io/helm/pkg/chartutil"
36
- "k8s.io/helm/pkg/proto/hapi/chart"
37
- "sigs.k8s.io/yaml"
38
39
)
39
40
40
41
const (
@@ -101,13 +102,7 @@ func (impl ChartTemplateServiceImpl) GetChartVersion(location string) (string, e
101
102
if _ , err := os .Stat (chartYaml ); os .IsNotExist (err ) {
102
103
return "" , fmt .Errorf ("Chart.yaml file not present in the directory %q" , location )
103
104
}
104
- //chartYaml = filepath.Join(chartYaml,filepath.Clean(chartYaml))
105
- chartYamlContent , err := ioutil .ReadFile (filepath .Clean (chartYaml ))
106
- if err != nil {
107
- return "" , fmt .Errorf ("cannot read Chart.Yaml in directory %q" , location )
108
- }
109
-
110
- chartContent , err := chartutil .UnmarshalChartfile (chartYamlContent )
105
+ chartContent , err := chartutil .LoadChartfile (filepath .Clean (chartYaml ))
111
106
if err != nil {
112
107
return "" , fmt .Errorf ("cannot read Chart.Yaml in directory %q" , location )
113
108
}
@@ -116,7 +111,7 @@ func (impl ChartTemplateServiceImpl) GetChartVersion(location string) (string, e
116
111
}
117
112
118
113
func (impl ChartTemplateServiceImpl ) FetchValuesFromReferenceChart (chartMetaData * chart.Metadata , refChartLocation string , templateName string , userId int32 , pipelineStrategyPath string ) (* ChartValues , error ) {
119
- chartMetaData .ApiVersion = "v1" // ensure always v1
114
+ chartMetaData .APIVersion = "v1" // ensure always v1
120
115
dir := impl .GetDir ()
121
116
chartDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
122
117
impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , chartDir )
@@ -155,7 +150,9 @@ func (impl ChartTemplateServiceImpl) FetchValuesFromReferenceChart(chartMetaData
155
150
156
151
// TODO: convert BuildChart and BuildChartProxyForHelmApps into one function
157
152
func (impl ChartTemplateServiceImpl ) BuildChart (ctx context.Context , chartMetaData * chart.Metadata , referenceTemplatePath string ) (string , error ) {
158
- chartMetaData .ApiVersion = "v1" // ensure always v1
153
+ if chartMetaData .APIVersion == "" {
154
+ chartMetaData .APIVersion = "v1" // ensure always v1
155
+ }
159
156
dir := impl .GetDir ()
160
157
tempReferenceTemplateDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
161
158
impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , tempReferenceTemplateDir )
@@ -183,7 +180,7 @@ func (impl ChartTemplateServiceImpl) BuildChart(ctx context.Context, chartMetaDa
183
180
func (impl ChartTemplateServiceImpl ) BuildChartProxyForHelmApps (chartCreateRequest * ChartCreateRequest ) (* ChartCreateResponse , error ) {
184
181
chartCreateResponse := & ChartCreateResponse {}
185
182
chartMetaData := chartCreateRequest .ChartMetaData
186
- chartMetaData .ApiVersion = "v2" // ensure always v2
183
+ chartMetaData .APIVersion = "v2" // ensure always v2
187
184
dir := impl .GetDir ()
188
185
chartDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
189
186
impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , chartDir )
@@ -282,42 +279,60 @@ func (impl ChartTemplateServiceImpl) getValues(directory, pipelineStrategyPath s
282
279
283
280
}
284
281
285
- func (impl ChartTemplateServiceImpl ) PackageChart ( tempReferenceTemplateDir string , chartMetaData * chart.Metadata ) (* string , string , error ) {
286
- valid , err := chartutil . IsChartDir ( tempReferenceTemplateDir )
282
+ func (impl ChartTemplateServiceImpl ) overrideChartMetaDataInDir ( chartDir string , chartMetaData * chart.Metadata ) (* chart. Chart , error ) {
283
+ chart , err := loader . LoadDir ( chartDir )
287
284
if err != nil {
288
- impl .logger .Errorw ("error in validating base chart" , "dir " , tempReferenceTemplateDir , "err" , err )
289
- return nil , "" , err
285
+ impl .logger .Errorw ("error in loading template chart" , "chartPath " , chartDir , "err" , err )
286
+ return nil , err
290
287
}
291
- if ! valid {
292
- impl .logger .Errorw ("invalid chart at " , "dir" , tempReferenceTemplateDir )
293
- return nil , "" , fmt .Errorf ("invalid base chart" )
288
+ if len (chartMetaData .Name ) > 0 {
289
+ chart .Metadata .Name = chartMetaData .Name
294
290
}
295
-
296
- b , err := yaml .Marshal (chartMetaData )
291
+ if len (chartMetaData .Version ) > 0 {
292
+ chart .Metadata .Version = chartMetaData .Version
293
+ }
294
+ chartMetaDataBytes , err := yaml .Marshal (chart .Metadata )
297
295
if err != nil {
298
296
impl .logger .Errorw ("error in marshaling chartMetadata" , "err" , err )
299
- return nil , "" , err
297
+ return chart , err
300
298
}
301
- err = ioutil .WriteFile (filepath .Join (tempReferenceTemplateDir , "Chart.yaml" ), b , 0600 )
299
+ err = ioutil .WriteFile (filepath .Join (chartDir , "Chart.yaml" ), chartMetaDataBytes , 0600 )
302
300
if err != nil {
303
301
impl .logger .Errorw ("err in writing Chart.yaml" , "err" , err )
302
+ return chart , err
303
+ }
304
+ return chart , nil
305
+ }
306
+
307
+ func (impl ChartTemplateServiceImpl ) PackageChart (tempReferenceTemplateDir string , chartMetaData * chart.Metadata ) (* string , string , error ) {
308
+ valid , err := chartutil .IsChartDir (tempReferenceTemplateDir )
309
+ if err != nil {
310
+ impl .logger .Errorw ("error in validating base chart" , "dir" , tempReferenceTemplateDir , "err" , err )
304
311
return nil , "" , err
305
312
}
306
- chart , err := chartutil .LoadDir (tempReferenceTemplateDir )
313
+ if ! valid {
314
+ impl .logger .Errorw ("invalid chart at " , "dir" , tempReferenceTemplateDir )
315
+ return nil , "" , fmt .Errorf ("invalid base chart" )
316
+ }
317
+ chart , err := impl .overrideChartMetaDataInDir (tempReferenceTemplateDir , chartMetaData )
307
318
if err != nil {
308
- impl .logger .Errorw ("error in loading chart dir " , "err " , err , "dir " , tempReferenceTemplateDir )
319
+ impl .logger .Errorw ("error in overriding chart metadata " , "chartPath " , tempReferenceTemplateDir , "err " , err )
309
320
return nil , "" , err
310
321
}
311
-
312
322
archivePath , err := chartutil .Save (chart , tempReferenceTemplateDir )
313
323
if err != nil {
314
324
impl .logger .Errorw ("error in saving" , "err" , err , "dir" , tempReferenceTemplateDir )
315
325
return nil , "" , err
316
326
}
317
327
impl .logger .Debugw ("chart archive path" , "path" , archivePath )
318
328
var valuesYaml string
329
+ byteValues , err := json .Marshal (chart .Values )
330
+ if err != nil {
331
+ impl .logger .Errorw ("error in json Marshal values" , "values" , chart .Values , "err" , err )
332
+ return nil , "" , err
333
+ }
319
334
if chart .Values != nil {
320
- valuesYaml = chart . Values . Raw
335
+ valuesYaml = string ( byteValues )
321
336
} else {
322
337
impl .logger .Warnw ("values.yaml not found in helm chart" , "dir" , tempReferenceTemplateDir )
323
338
}
@@ -339,7 +354,7 @@ func (impl ChartTemplateServiceImpl) GetDir() string {
339
354
340
355
// GetByteArrayRefChart this method will be used for getting byte array from reference chart to store in db
341
356
func (impl ChartTemplateServiceImpl ) GetByteArrayRefChart (chartMetaData * chart.Metadata , referenceTemplatePath string ) ([]byte , error ) {
342
- chartMetaData .ApiVersion = "v1" // ensure always v1
357
+ chartMetaData .APIVersion = "v1" // ensure always v1
343
358
dir := impl .GetDir ()
344
359
tempReferenceTemplateDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
345
360
impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , tempReferenceTemplateDir )
@@ -377,8 +392,7 @@ func (impl ChartTemplateServiceImpl) GetByteArrayRefChart(chartMetaData *chart.M
377
392
func (impl ChartTemplateServiceImpl ) LoadChartInBytes (ChartPath string , deleteChart bool ) ([]byte , error ) {
378
393
379
394
var chartBytesArr []byte
380
- //this function is removed in latest helm release and is replaced by Loader in loader package
381
- chart , err := chartutil .LoadDir (ChartPath )
395
+ chart , err := loader .LoadDir (ChartPath )
382
396
if err != nil {
383
397
impl .logger .Errorw ("error in loading chart dir" , "err" , err , "dir" )
384
398
return chartBytesArr , err
@@ -398,7 +412,7 @@ func (impl ChartTemplateServiceImpl) LoadChartInBytes(ChartPath string, deleteCh
398
412
399
413
func (impl ChartTemplateServiceImpl ) LoadChartFromDir (dir string ) (* chart.Chart , error ) {
400
414
//this function is removed in latest helm release and is replaced by Loader in loader package
401
- chart , err := chartutil .LoadDir (dir )
415
+ chart , err := loader .LoadDir (dir )
402
416
if err != nil {
403
417
impl .logger .Errorw ("error in loading chart dir" , "err" , err , "dir" )
404
418
return chart , err
0 commit comments