cmd/eksctl-anywhere/cmd/upgradeplanmanagementcomponents.go (101 lines of code) (raw):
package cmd
import (
"context"
"fmt"
"log"
"github.com/spf13/cobra"
"github.com/aws/eks-anywhere/pkg/cluster"
capiupgrader "github.com/aws/eks-anywhere/pkg/clusterapi"
eksaupgrader "github.com/aws/eks-anywhere/pkg/clustermanager"
"github.com/aws/eks-anywhere/pkg/dependencies"
fluxupgrader "github.com/aws/eks-anywhere/pkg/gitops/flux"
"github.com/aws/eks-anywhere/pkg/logger"
"github.com/aws/eks-anywhere/pkg/providers"
"github.com/aws/eks-anywhere/pkg/types"
"github.com/aws/eks-anywhere/pkg/workflows/interfaces"
)
var upgradePlanManagementComponentsCmd = &cobra.Command{
Use: "management-components",
Short: "Lists the current and target versions for upgrading the management components in a management cluster",
Long: "Provides a list of current and target versions for upgrading the management components in a management cluster. The term 'management components' encompasses all Kubernetes controllers and their CRDs present in the management cluster that are responsible for reconciling your EKS Anywhere (EKS-A) cluster.",
PreRunE: bindFlagsToViper,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
if err := uc.upgradePlanManagementComponents(cmd.Context()); err != nil {
return fmt.Errorf("failed to display upgrade plan: %v", err)
}
return nil
},
}
func init() {
upgradePlanCmd.AddCommand(upgradePlanManagementComponentsCmd)
upgradePlanManagementComponentsCmd.Flags().StringVarP(&uc.fileName, "filename", "f", "", "Filename that contains EKS-A cluster configuration")
upgradePlanManagementComponentsCmd.Flags().StringVar(&uc.bundlesOverride, "bundles-override", "", "Override default Bundles manifest (not recommended)")
upgradePlanManagementComponentsCmd.Flags().StringVarP(&output, outputFlagName, "o", outputDefault, "Output format: text|json")
upgradePlanManagementComponentsCmd.Flags().StringVar(&uc.managementKubeconfig, "kubeconfig", "", "Management cluster kubeconfig file")
err := upgradePlanManagementComponentsCmd.MarkFlagRequired("filename")
if err != nil {
log.Fatalf("Error marking flag as required: %v", err)
}
}
func (uc *upgradeClusterOptions) upgradePlanManagementComponents(ctx context.Context) error {
if _, err := uc.commonValidations(ctx); err != nil {
return fmt.Errorf("common validations failed due to: %v", err)
}
newClusterSpec, err := newBasicClusterSpec(uc.clusterOptions)
if err != nil {
return err
}
deps, err := dependencies.ForSpec(newClusterSpec).
WithClusterManager(newClusterSpec.Cluster, nil).
WithProvider(uc.fileName, newClusterSpec.Cluster, false, uc.hardwareCSVPath, uc.forceClean, uc.tinkerbellBootstrapIP, map[string]bool{}, uc.providerOptions).
WithGitOpsFlux(newClusterSpec.Cluster, newClusterSpec.FluxConfig, nil).
WithCAPIManager().
Build(ctx)
if err != nil {
return err
}
managementCluster := &types.Cluster{
Name: newClusterSpec.Cluster.Name,
KubeconfigFile: getKubeconfigPath(newClusterSpec.Cluster.Name, uc.wConfig),
}
if newClusterSpec.ManagementCluster != nil {
managementCluster = newClusterSpec.ManagementCluster
}
logger.V(0).Info("Checking new release availability...")
currentSpec, err := deps.ClusterManager.GetCurrentClusterSpec(ctx, managementCluster, newClusterSpec.Cluster.Name)
if err != nil {
return err
}
if !newClusterSpec.Cluster.IsSelfManaged() {
logger.V(0).Info(fmt.Sprintf("No management components to plan. Cluster %s is not a self-managed cluster.", newClusterSpec.Cluster.Name))
return nil
}
var componentChangeDiffs *types.ChangeDiff
componentChangeDiffs, err = getManagementComponentsChangeDiffs(ctx, deps.UnAuthKubeClient, managementCluster, currentSpec, newClusterSpec, deps.Provider)
if err != nil {
return err
}
serializedDiff, err := serialize(componentChangeDiffs, output)
if err != nil {
return err
}
logger.V(0).Info(serializedDiff)
return nil
}
func getManagementComponentsChangeDiffs(ctx context.Context, clientFactory interfaces.ClientFactory, managementCluster *types.Cluster, currentSpec *cluster.Spec, newClusterSpec *cluster.Spec, provider providers.Provider) (*types.ChangeDiff, error) {
client, err := clientFactory.BuildClientFromKubeconfig(managementCluster.KubeconfigFile)
if err != nil {
return nil, err
}
currentManagementComponents, err := cluster.GetManagementComponents(ctx, client, currentSpec.Cluster)
if err != nil {
return nil, err
}
componentChangeDiffs := &types.ChangeDiff{}
newManagementComponents := cluster.ManagementComponentsFromBundles(newClusterSpec.Bundles)
componentChangeDiffs.Append(eksaupgrader.EksaChangeDiff(currentManagementComponents, newManagementComponents))
componentChangeDiffs.Append(fluxupgrader.ChangeDiff(currentManagementComponents, newManagementComponents, currentSpec, newClusterSpec))
componentChangeDiffs.Append(capiupgrader.ChangeDiff(currentManagementComponents, newManagementComponents, provider))
return componentChangeDiffs, nil
}