@@ -19,22 +19,23 @@ package util
1919import (
2020 "compress/gzip"
2121 "context"
22+ "encoding/json"
2223 "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"
2331 "io/ioutil"
2432 "math/rand"
2533 "os"
2634 "path/filepath"
35+ "sigs.k8s.io/yaml"
2736 "strconv"
2837 "strings"
2938 "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"
3839)
3940
4041const (
@@ -101,13 +102,7 @@ func (impl ChartTemplateServiceImpl) GetChartVersion(location string) (string, e
101102 if _ , err := os .Stat (chartYaml ); os .IsNotExist (err ) {
102103 return "" , fmt .Errorf ("Chart.yaml file not present in the directory %q" , location )
103104 }
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 ))
111106 if err != nil {
112107 return "" , fmt .Errorf ("cannot read Chart.Yaml in directory %q" , location )
113108 }
@@ -116,7 +111,7 @@ func (impl ChartTemplateServiceImpl) GetChartVersion(location string) (string, e
116111}
117112
118113func (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
120115 dir := impl .GetDir ()
121116 chartDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
122117 impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , chartDir )
@@ -155,7 +150,9 @@ func (impl ChartTemplateServiceImpl) FetchValuesFromReferenceChart(chartMetaData
155150
156151// TODO: convert BuildChart and BuildChartProxyForHelmApps into one function
157152func (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+ }
159156 dir := impl .GetDir ()
160157 tempReferenceTemplateDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
161158 impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , tempReferenceTemplateDir )
@@ -183,7 +180,7 @@ func (impl ChartTemplateServiceImpl) BuildChart(ctx context.Context, chartMetaDa
183180func (impl ChartTemplateServiceImpl ) BuildChartProxyForHelmApps (chartCreateRequest * ChartCreateRequest ) (* ChartCreateResponse , error ) {
184181 chartCreateResponse := & ChartCreateResponse {}
185182 chartMetaData := chartCreateRequest .ChartMetaData
186- chartMetaData .ApiVersion = "v2" // ensure always v2
183+ chartMetaData .APIVersion = "v2" // ensure always v2
187184 dir := impl .GetDir ()
188185 chartDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
189186 impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , chartDir )
@@ -282,42 +279,60 @@ func (impl ChartTemplateServiceImpl) getValues(directory, pipelineStrategyPath s
282279
283280}
284281
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 )
287284 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
290287 }
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
294290 }
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 )
297295 if err != nil {
298296 impl .logger .Errorw ("error in marshaling chartMetadata" , "err" , err )
299- return nil , "" , err
297+ return chart , err
300298 }
301- err = ioutil .WriteFile (filepath .Join (tempReferenceTemplateDir , "Chart.yaml" ), b , 0600 )
299+ err = ioutil .WriteFile (filepath .Join (chartDir , "Chart.yaml" ), chartMetaDataBytes , 0600 )
302300 if err != nil {
303301 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 )
304311 return nil , "" , err
305312 }
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 )
307318 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 )
309320 return nil , "" , err
310321 }
311-
312322 archivePath , err := chartutil .Save (chart , tempReferenceTemplateDir )
313323 if err != nil {
314324 impl .logger .Errorw ("error in saving" , "err" , err , "dir" , tempReferenceTemplateDir )
315325 return nil , "" , err
316326 }
317327 impl .logger .Debugw ("chart archive path" , "path" , archivePath )
318328 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+ }
319334 if chart .Values != nil {
320- valuesYaml = chart . Values . Raw
335+ valuesYaml = string ( byteValues )
321336 } else {
322337 impl .logger .Warnw ("values.yaml not found in helm chart" , "dir" , tempReferenceTemplateDir )
323338 }
@@ -339,7 +354,7 @@ func (impl ChartTemplateServiceImpl) GetDir() string {
339354
340355// GetByteArrayRefChart this method will be used for getting byte array from reference chart to store in db
341356func (impl ChartTemplateServiceImpl ) GetByteArrayRefChart (chartMetaData * chart.Metadata , referenceTemplatePath string ) ([]byte , error ) {
342- chartMetaData .ApiVersion = "v1" // ensure always v1
357+ chartMetaData .APIVersion = "v1" // ensure always v1
343358 dir := impl .GetDir ()
344359 tempReferenceTemplateDir := filepath .Join (CHART_WORKING_DIR_PATH , dir )
345360 impl .logger .Debugw ("chart dir " , "chart" , chartMetaData .Name , "dir" , tempReferenceTemplateDir )
@@ -377,8 +392,7 @@ func (impl ChartTemplateServiceImpl) GetByteArrayRefChart(chartMetaData *chart.M
377392func (impl ChartTemplateServiceImpl ) LoadChartInBytes (ChartPath string , deleteChart bool ) ([]byte , error ) {
378393
379394 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 )
382396 if err != nil {
383397 impl .logger .Errorw ("error in loading chart dir" , "err" , err , "dir" )
384398 return chartBytesArr , err
@@ -398,7 +412,7 @@ func (impl ChartTemplateServiceImpl) LoadChartInBytes(ChartPath string, deleteCh
398412
399413func (impl ChartTemplateServiceImpl ) LoadChartFromDir (dir string ) (* chart.Chart , error ) {
400414 //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 )
402416 if err != nil {
403417 impl .logger .Errorw ("error in loading chart dir" , "err" , err , "dir" )
404418 return chart , err
0 commit comments