@@ -2,13 +2,18 @@ package charts
22
33import (
44 "fmt"
5+ "net/url"
56 "path/filepath"
67
78 "github.com/blang/semver"
89 "github.com/go-git/go-billy/v5"
910 "github.com/rancher/charts-build-scripts/pkg/filesystem"
1011 "github.com/rancher/charts-build-scripts/pkg/helm"
12+ "github.com/rancher/charts-build-scripts/pkg/icons"
13+ "github.com/rancher/charts-build-scripts/pkg/path"
1114 "github.com/sirupsen/logrus"
15+ helmLoader "helm.sh/helm/v3/pkg/chart/loader"
16+ "helm.sh/helm/v3/pkg/chartutil"
1217)
1318
1419// Package represents the configuration of a particular forked Helm chart
@@ -85,8 +90,43 @@ func (p *Package) GeneratePatch() error {
8590 return nil
8691}
8792
93+ // DownloadIcon Downloads the icon from the charts.yaml file to the assets/logos folder
94+ // and changes the chart.yaml file to use it
95+ func (p * Package ) DownloadIcon () error {
96+ exists , err := filesystem .PathExists (p .fs , path .RepositoryChartsDir )
97+ if err != nil {
98+ return fmt .Errorf ("failed to check for charts dir. Err: %w" , err )
99+ }
100+ if ! exists {
101+ logrus .Infof ("Charts dir does not exists. Please run `make prepare` first" )
102+ return nil
103+ }
104+ absHelmChartPath := filesystem .GetAbsPath (p .fs , path .RepositoryChartsDir )
105+ chart , err := helmLoader .Load (absHelmChartPath )
106+ if err != nil {
107+ return fmt .Errorf ("could not load Helm chart: %s" , err )
108+ }
109+ u , err := url .Parse (chart .Metadata .Icon )
110+ if err == nil && (u .Scheme == "http" || u .Scheme == "https" ) {
111+ logrus .Infof ("Chart icon is pointing to a remote url. Downloading it..." )
112+ // download icon and change the icon property to point to it
113+ p , err := icons .Download (p .rootFs , chart .Metadata )
114+ if err == nil { // managed to download the icon and save it locally
115+ chart .Metadata .Icon = fmt .Sprintf ("file://%s" , p )
116+ } else {
117+ logrus .Errorf ("failed to download icon for chart %s, err: %s" , chart .Name (), err )
118+ }
119+ chartYamlPath := fmt .Sprintf ("%s/Chart.yaml" , absHelmChartPath )
120+ err = chartutil .SaveChartfile (chartYamlPath , chart .Metadata )
121+ if err != nil {
122+ return fmt .Errorf ("failed to save chart.yaml file. err: %w" , err )
123+ }
124+ }
125+ return nil
126+ }
127+
88128// GenerateCharts creates Helm chart archives for each chart after preparing it
89- func (p * Package ) GenerateCharts (omitBuildMetadataOnExport bool , validateOnly bool ) error {
129+ func (p * Package ) GenerateCharts (omitBuildMetadataOnExport bool ) error {
90130 if p .DoNotRelease {
91131 logrus .Infof ("Skipping package marked doNotRelease" )
92132 return nil
@@ -95,12 +135,12 @@ func (p *Package) GenerateCharts(omitBuildMetadataOnExport bool, validateOnly bo
95135 return fmt .Errorf ("encountered error while trying to prepare package: %s" , err )
96136 }
97137 // Add PackageVersion to format
98- err := p .Chart .GenerateChart (p .rootFs , p .fs , p .PackageVersion , p .Version , omitBuildMetadataOnExport , validateOnly )
138+ err := p .Chart .GenerateChart (p .rootFs , p .fs , p .PackageVersion , p .Version , omitBuildMetadataOnExport )
99139 if err != nil {
100140 return fmt .Errorf ("encountered error while exporting main chart: %s" , err )
101141 }
102142 for _ , additionalChart := range p .AdditionalCharts {
103- err = additionalChart .GenerateChart (p .rootFs , p .fs , p .PackageVersion , p .Version , omitBuildMetadataOnExport , validateOnly )
143+ err = additionalChart .GenerateChart (p .rootFs , p .fs , p .PackageVersion , p .Version , omitBuildMetadataOnExport )
104144 if err != nil {
105145 return fmt .Errorf ("encountered error while exporting %s: %s" , additionalChart .WorkingDir , err )
106146 }
0 commit comments