59 lines
1.9 KiB
Go
59 lines
1.9 KiB
Go
package sdk
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/portainer/portainer/pkg/libhelm/options"
|
|
"helm.sh/helm/v4/pkg/action"
|
|
"helm.sh/helm/v4/pkg/release/common"
|
|
releasev1 "helm.sh/helm/v4/pkg/release/v1"
|
|
"helm.sh/helm/v4/pkg/storage/driver"
|
|
)
|
|
|
|
func (hspm *HelmSDKPackageManager) doesReleaseExist(releaseName, namespace string, clusterAccess *options.KubernetesClusterAccess) (bool, error) {
|
|
// Initialize action configuration
|
|
actionConfig := new(action.Configuration)
|
|
err := hspm.initActionConfig(actionConfig, namespace, clusterAccess)
|
|
if err != nil {
|
|
// error is already logged in initActionConfig
|
|
return false, fmt.Errorf("failed to initialize helm configuration: %w", err)
|
|
}
|
|
|
|
historyClient, err := hspm.initHistoryClient(actionConfig, namespace, clusterAccess)
|
|
if err != nil {
|
|
// error is already logged in initHistoryClient
|
|
return false, fmt.Errorf("failed to initialize helm history client: %w", err)
|
|
}
|
|
|
|
versions, err := historyClient.Run(releaseName)
|
|
|
|
releases := make([]*releasev1.Release, 0, len(versions))
|
|
for _, val := range versions {
|
|
rel, err := releaserToV1Release(val)
|
|
if err != nil {
|
|
return false, fmt.Errorf("failed to convert helm release to helm release v1: %w", err)
|
|
}
|
|
releases = append(releases, rel)
|
|
}
|
|
|
|
if errors.Is(err, driver.ErrReleaseNotFound) || isReleaseUninstalled(releases) {
|
|
return false, nil
|
|
} else if err != nil {
|
|
return false, fmt.Errorf("failed to get history: %w", err)
|
|
}
|
|
|
|
return true, nil
|
|
}
|
|
|
|
func isReleaseUninstalled(versions []*releasev1.Release) bool {
|
|
return len(versions) > 0 && versions[len(versions)-1].Info.Status == common.StatusUninstalled
|
|
}
|
|
|
|
func (hspm *HelmSDKPackageManager) initHistoryClient(actionConfig *action.Configuration, namespace string, clusterAccess *options.KubernetesClusterAccess) (*action.History, error) {
|
|
historyClient := action.NewHistory(actionConfig)
|
|
historyClient.Max = 1
|
|
|
|
return historyClient, nil
|
|
}
|