2025-03-13 12:20:16 +13:00
package sdk
import (
"github.com/pkg/errors"
"github.com/portainer/portainer/pkg/libhelm/options"
"github.com/rs/zerolog/log"
"helm.sh/helm/v3/pkg/action"
)
// Uninstall implements the HelmPackageManager interface by using the Helm SDK to uninstall a release.
func ( hspm * HelmSDKPackageManager ) Uninstall ( uninstallOpts options . UninstallOptions ) error {
if uninstallOpts . Name == "" {
log . Error ( ) .
Str ( "context" , "HelmClient" ) .
Msg ( "Release name is required" )
return errors . New ( "release name is required" )
}
log . Debug ( ) .
Str ( "context" , "HelmClient" ) .
Str ( "release" , uninstallOpts . Name ) .
Str ( "namespace" , uninstallOpts . Namespace ) .
Msg ( "Uninstalling Helm release" )
// Initialize action configuration with kubernetes config
actionConfig := new ( action . Configuration )
err := hspm . initActionConfig ( actionConfig , uninstallOpts . Namespace , uninstallOpts . KubernetesClusterAccess )
if err != nil {
2025-03-26 11:32:26 +13:00
// error is already logged in initActionConfig
2025-03-13 12:20:16 +13:00
return errors . Wrap ( err , "failed to initialize helm configuration" )
}
// Create uninstallClient action
uninstallClient := action . NewUninstall ( actionConfig )
// 'foreground' means the parent object remains in a "terminating" state until all of its children are deleted. This ensures that all dependent resources are completely removed before finalizing the deletion of the parent resource.
uninstallClient . DeletionPropagation = "foreground" // "background" or "orphan"
// Run the uninstallation
log . Info ( ) .
Str ( "context" , "HelmClient" ) .
Str ( "release" , uninstallOpts . Name ) .
Str ( "namespace" , uninstallOpts . Namespace ) .
Msg ( "Running uninstallation" )
result , err := uninstallClient . Run ( uninstallOpts . Name )
if err != nil {
log . Error ( ) .
Str ( "context" , "HelmClient" ) .
Str ( "release" , uninstallOpts . Name ) .
Str ( "namespace" , uninstallOpts . Namespace ) .
Err ( err ) .
Msg ( "Failed to uninstall helm release" )
return errors . Wrap ( err , "failed to uninstall helm release" )
}
if result != nil {
log . Debug ( ) .
Str ( "context" , "HelmClient" ) .
Str ( "release" , uninstallOpts . Name ) .
Str ( "release_info" , result . Release . Info . Description ) .
Msg ( "Uninstall result details" )
}
return nil
}