internal/flows/upgrade.go (115 lines of code) (raw):

package flows import ( "context" "fmt" "github.com/pkg/errors" "go.uber.org/zap" "github.com/aws/eks-hybrid/internal/aws" "github.com/aws/eks-hybrid/internal/cni" "github.com/aws/eks-hybrid/internal/containerd" "github.com/aws/eks-hybrid/internal/creds" "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/nodeprovider" "github.com/aws/eks-hybrid/internal/packagemanager" "github.com/aws/eks-hybrid/internal/ssm" "github.com/aws/eks-hybrid/internal/tracker" ) type Upgrader struct { NodeProvider nodeprovider.NodeProvider AwsSource aws.Source PackageManager *packagemanager.DistroPackageManager CredentialProvider creds.CredentialProvider Artifacts *tracker.InstalledArtifacts DaemonManager daemon.DaemonManager SkipPhases []string Logger *zap.Logger } func (u *Upgrader) Run(ctx context.Context) error { if err := u.upgradeDistroPackages(ctx); err != nil { return err } if err := u.upgradeCredentialProvider(ctx); err != nil { return err } if err := u.upgradeEksArtifacts(ctx); err != nil { return err } if err := u.NodeProvider.ConfigureAws(ctx); err != nil { return err } if err := u.NodeProvider.Enrich(ctx); err != nil { return err } if err := initDaemons(ctx, u.NodeProvider, u.SkipPhases, u.Logger); err != nil { return err } return u.NodeProvider.Cleanup() } func (u *Upgrader) upgradeDistroPackages(ctx context.Context) error { u.Logger.Info("Refreshing package manager metadata cache...") if err := u.PackageManager.RefreshMetadataCache(ctx); err != nil { return err } if u.Artifacts.Containerd != string(containerd.ContainerdSourceNone) { u.Logger.Info("Upgrading containerd...") if err := containerd.Upgrade(ctx, u.PackageManager); err != nil { return err } } if u.Artifacts.Iptables { u.Logger.Info("Upgrading iptables...") if err := iptables.Upgrade(ctx, u.PackageManager); err != nil { return err } } return nil } func (u *Upgrader) upgradeCredentialProvider(ctx context.Context) error { switch u.CredentialProvider { case creds.IamRolesAnywhereCredentialProvider: u.Logger.Info("Upgrading AWS signing helper...") if err := iamrolesanywhere.Upgrade(ctx, u.AwsSource, u.Logger); err != nil { return err } case creds.SsmCredentialProvider: nodeConfig := u.NodeProvider.GetNodeConfig() ssmInstaller := ssm.NewSSMInstaller(u.Logger, nodeConfig.Spec.Cluster.Region) u.Logger.Info("Upgrading SSM agent installer...") if err := ssm.Upgrade(ctx, ssm.InstallOptions{ Source: ssmInstaller, Logger: u.Logger, Region: nodeConfig.Spec.Cluster.Region, }); err != nil { return err } default: return fmt.Errorf("installed credential provider %s is not supported for upgrade", u.CredentialProvider) } return nil } func (u *Upgrader) upgradeEksArtifacts(ctx context.Context) error { u.Logger.Info("Upgrading kubelet...") if err := kubelet.Upgrade(ctx, u.AwsSource, u.Logger); err != nil { return errors.Wrap(err, "failed to upgrade kubelet") } u.Logger.Info("Upgrading kubectl...") if err := kubectl.Upgrade(ctx, u.AwsSource, u.Logger); err != nil { return err } u.Logger.Info("Upgrading image credential provider...") if err := imagecredentialprovider.Upgrade(ctx, u.AwsSource, u.Logger); err != nil { return err } u.Logger.Info("Upgrading IAM authenticator...") if err := iamauthenticator.Upgrade(ctx, u.AwsSource, u.Logger); err != nil { return err } u.Logger.Info("Upgrading cni-plugins...") return cni.Upgrade(ctx, u.AwsSource, u.Logger) }