diff --git a/pkg/app/init_test.go b/pkg/app/init_test.go index bec58d24..63b5be45 100644 --- a/pkg/app/init_test.go +++ b/pkg/app/init_test.go @@ -11,6 +11,7 @@ import ( "strings" "testing" + "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" @@ -271,6 +272,16 @@ func TestCheckHelmPlugins_UpdateFailsFallbackToReinstall(t *testing.T) { assert.Contains(t, calledOps, "uninstall:"+p.name, "expected uninstall to be called for plugin %s", p.name) assert.Contains(t, calledOps, "install:"+p.name, "expected install to be called for plugin %s", p.name) } + + // Verify that all plugins are now at (or above) the required version on disk. + for _, p := range helmPlugins { + requiredVersion, err := semver.NewVersion(p.version) + require.NoError(t, err) + installedVersion, err := helmexec.GetPluginVersion(p.name, pluginsDir) + require.NoError(t, err, "plugin %s should be present after reinstall", p.name) + assert.False(t, installedVersion.LessThan(requiredVersion), + "plugin %s: installed version %s should be >= required version %s", p.name, installedVersion, requiredVersion) + } } func TestCheckHelmPlugins_UpdateErrorButPluginAtRequiredVersion(t *testing.T) { diff --git a/pkg/helmexec/exec.go b/pkg/helmexec/exec.go index 84115847..17330daf 100644 --- a/pkg/helmexec/exec.go +++ b/pkg/helmexec/exec.go @@ -946,11 +946,15 @@ func (helm *execer) UpdatePlugin(name, path, version string) error { helm.info(out) if err != nil { // If standard update failed, fall back to uninstall + reinstall with specific version - helm.logger.Infof("helm plugin update %v failed, falling back to reinstall with version %v", name, version) + updateErr := err + helm.logger.Infof("helm plugin update %v failed (%v), falling back to reinstall with version %v", name, updateErr, version) if uninstallErr := helm.uninstallPlugin(name); uninstallErr != nil { helm.logger.Warnf("Failed to uninstall helm plugin %v: %v", name, uninstallErr) } - return helm.AddPlugin(name, path, version) + if reinstallErr := helm.AddPlugin(name, path, version); reinstallErr != nil { + return fmt.Errorf("helm plugin update failed (%w) and reinstall also failed: %w", updateErr, reinstallErr) + } + return nil } return nil }