internal/flows/uninstall.go (146 lines of code) (raw):

package flows import ( "context" "fmt" "os" "github.com/aws/aws-sdk-go-v2/config" awsSsm "github.com/aws/aws-sdk-go-v2/service/ssm" "go.uber.org/zap" "github.com/aws/eks-hybrid/internal/containerd" "github.com/aws/eks-hybrid/internal/daemon" "github.com/aws/eks-hybrid/internal/iamauthenticator" "github.com/aws/eks-hybrid/internal/iamrolesanywhere" "github.com/aws/eks-hybrid/internal/imagecredentialprovider" "github.com/aws/eks-hybrid/internal/iptables" "github.com/aws/eks-hybrid/internal/kubectl" "github.com/aws/eks-hybrid/internal/kubelet" "github.com/aws/eks-hybrid/internal/packagemanager" "github.com/aws/eks-hybrid/internal/ssm" "github.com/aws/eks-hybrid/internal/tracker" ) const eksConfigDir = "/etc/eks" type ( CNIUninstall func() error ) type Uninstaller struct { Artifacts *tracker.InstalledArtifacts DaemonManager daemon.DaemonManager PackageManager *packagemanager.DistroPackageManager Logger *zap.Logger CNIUninstall CNIUninstall } func (u *Uninstaller) Run(ctx context.Context) error { if err := u.uninstallDaemons(ctx); err != nil { return err } if err := u.uninstallBinaries(ctx); err != nil { return err } if err := u.cleanup(); err != nil { return err } u.Logger.Info("Finished uninstallation tasks...") return tracker.Clear() } func (u *Uninstaller) uninstallDaemons(ctx context.Context) error { if u.Artifacts.Kubelet { u.Logger.Info("Uninstalling kubelet...") if err := u.DaemonManager.StopDaemon(kubelet.KubeletDaemonName); err != nil { return err } if err := kubelet.Uninstall(kubelet.UninstallOptions{}); err != nil { return err } } if u.Artifacts.Ssm { u.Logger.Info("Stopping SSM daemon...") if err := u.DaemonManager.StopDaemon(ssm.SsmDaemonName); err != nil { return err } ssmRegistration := ssm.NewSSMRegistration() region := ssmRegistration.GetRegion() opts := []func(*config.LoadOptions) error{} if region != "" { opts = append(opts, config.WithRegion(region)) } awsConfig, err := config.LoadDefaultConfig(ctx, opts...) if err != nil { return err } if err := ssm.Uninstall(ctx, ssm.UninstallOptions{ Logger: u.Logger, SSMRegistration: ssmRegistration, PkgSource: u.PackageManager, SSMClient: awsSsm.NewFromConfig(awsConfig), }); err != nil { return fmt.Errorf("uninstalling SSM: %w", err) } } if u.Artifacts.IamRolesAnywhere { u.Logger.Info("Removing aws_signing_helper_update daemon...") if status, err := u.DaemonManager.GetDaemonStatus(iamrolesanywhere.DaemonName); err == nil || status != daemon.DaemonStatusUnknown { if err = u.DaemonManager.StopDaemon(iamrolesanywhere.DaemonName); err != nil { u.Logger.Info("Stopping aws_signing_helper_update daemon...") return err } } } if u.Artifacts.Containerd != string(containerd.ContainerdSourceNone) { u.Logger.Info("Uninstalling containerd...") if err := u.DaemonManager.StopDaemon(containerd.ContainerdDaemonName); err != nil { return err } if err := containerd.Uninstall(ctx, u.PackageManager); err != nil { return err } } return nil } func (u *Uninstaller) uninstallBinaries(ctx context.Context) error { if u.Artifacts.Kubectl { u.Logger.Info("Uninstalling kubectl...") if err := kubectl.Uninstall(); err != nil { return err } } if u.Artifacts.CniPlugins { u.Logger.Info("Uninstalling cni-plugins...") if err := u.CNIUninstall(); err != nil { return err } } if u.Artifacts.IamAuthenticator { u.Logger.Info("Uninstalling IAM authenticator...") if err := iamauthenticator.Uninstall(); err != nil { return err } } if u.Artifacts.IamRolesAnywhere { u.Logger.Info("Uninstalling AWS signing helper...") if err := iamrolesanywhere.Uninstall(); err != nil { return err } } if u.Artifacts.ImageCredentialProvider { u.Logger.Info("Uninstalling image credential provider...") if err := imagecredentialprovider.Uninstall(); err != nil { return err } } if u.Artifacts.Iptables { u.Logger.Info("Uninstalling iptables...") if err := iptables.Uninstall(ctx, u.PackageManager); err != nil { return err } } return nil } // cleanup removes directories or files that are not individually owned by single component func (u *Uninstaller) cleanup() error { if err := u.PackageManager.Cleanup(); err != nil { return err } if err := os.RemoveAll(eksConfigDir); err != nil { return err } return nil }