Skip to content

Commit 867afb0

Browse files
authored
Merge pull request #1645 from gianlucam76/release-1.6
(bug) Enhance Helm Dependency Resolution and Metadata Validation
2 parents 811a297 + 1f45041 commit 867afb0

1 file changed

Lines changed: 72 additions & 5 deletions

File tree

controllers/handlers_helm.go

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1734,11 +1734,10 @@ func upgradeRelease(ctx context.Context, clusterSummary *configv1beta1.ClusterSu
17341734

17351735
requestedChart.ChartVersion = getChartVersion(requestedChart, chartRequested)
17361736

1737-
if req := chartRequested.Metadata.Dependencies; req != nil {
1738-
err = action.CheckDependencies(chartRequested, req)
1739-
if err != nil {
1740-
return nil, err
1741-
}
1737+
chartRequested, err = prepareChartAndDependencies(chartRequested, requestedChart, chartName,
1738+
settings, registryOptions, logger)
1739+
if err != nil {
1740+
return nil, err
17421741
}
17431742

17441743
err = upgradeCRDs(ctx, requestedChart, kubeconfig, chartRequested.CRDObjects(), logger)
@@ -1788,6 +1787,69 @@ func handleUpgradeError(ctx context.Context, err error, clusterSummary *configv1
17881787
return err
17891788
}
17901789

1790+
// prepareChartAndDependencies ensures chart dependencies are present and metadata is valid.
1791+
func prepareChartAndDependencies(
1792+
chartRequested *chart.Chart,
1793+
requestedChart *configv1beta1.HelmChart,
1794+
chartPath string, // This is the 'chartName' path inside tmpDir
1795+
settings *cli.EnvSettings,
1796+
registryOptions *registryClientOptions,
1797+
logger logr.Logger,
1798+
) (*chart.Chart, error) {
1799+
1800+
req := chartRequested.Metadata.Dependencies
1801+
if req == nil {
1802+
return chartRequested, nil
1803+
}
1804+
1805+
regClient, err := getRegistryClient(requestedChart.ReleaseNamespace, registryOptions,
1806+
getEnableClientCacheValue(requestedChart.Options))
1807+
if err != nil {
1808+
return nil, fmt.Errorf("failed to get registry client: %w", err)
1809+
}
1810+
1811+
// Check if dependencies are actually missing
1812+
if err := action.CheckDependencies(chartRequested, req); err != nil {
1813+
logger.V(logs.LogInfo).Info("Dependencies missing or out of date, attempting to fetch")
1814+
1815+
man := &downloader.Manager{
1816+
Out: os.Stdout,
1817+
ChartPath: chartPath,
1818+
Getters: getter.All(settings),
1819+
RepositoryConfig: settings.RepositoryConfig,
1820+
RepositoryCache: settings.RepositoryCache,
1821+
RegistryClient: regClient,
1822+
}
1823+
1824+
if err := man.Update(); err != nil {
1825+
return nil, fmt.Errorf("failed to update dependencies: %w", err)
1826+
}
1827+
1828+
// Reload from the directory where man.Update() just ran
1829+
chartRequested, err = loader.Load(chartPath)
1830+
if err != nil {
1831+
// Potential recovery: Use LoadDir which can be more forgiving with paths
1832+
logger.V(logs.LogDebug).Info("standard loader failed, trying LoadDir", "err", err)
1833+
chartRequested, err = loader.LoadDir(chartPath)
1834+
if err != nil {
1835+
return nil, fmt.Errorf("failed to reload chart: %w", err)
1836+
}
1837+
}
1838+
}
1839+
1840+
// Sanitize the version to avoid "invalid semantic version" errors
1841+
if chartRequested.Metadata.Version == "" || !isValidSemver(chartRequested.Metadata.Version) {
1842+
logger.V(logs.LogInfo).Info("fixing invalid or empty chart version", "oldVersion",
1843+
chartRequested.Metadata.Version)
1844+
chartRequested.Metadata.Version = "0.1.0"
1845+
}
1846+
1847+
// Keep the requestedChart object in sync with actual loaded metadata
1848+
requestedChart.ChartVersion = chartRequested.Metadata.Version
1849+
1850+
return chartRequested, nil
1851+
}
1852+
17911853
func upgradeCRDsInFile(ctx context.Context, dr dynamic.ResourceInterface, chartFile *chart.File,
17921854
logger logr.Logger) (int, error) {
17931855

@@ -4686,3 +4748,8 @@ func getStaleReleases(ctx context.Context, c client.Client, clusterSummary *conf
46864748

46874749
return staleReleases, nil
46884750
}
4751+
4752+
func isValidSemver(v string) bool {
4753+
_, err := semver.NewVersion(v)
4754+
return err == nil
4755+
}

0 commit comments

Comments
 (0)