in pkg/clustermanager/cluster_manager.go [328:422]
func (c *ClusterManager) UpgradeCluster(ctx context.Context, managementCluster, workloadCluster *types.Cluster, newClusterSpec *cluster.Spec, provider providers.Provider) error {
currentSpec, err := c.GetCurrentClusterSpec(ctx, workloadCluster, newClusterSpec.Name)
if err != nil {
return fmt.Errorf("error getting current cluster spec: %v", err)
}
cpContent, mdContent, err := provider.GenerateCAPISpecForUpgrade(ctx, managementCluster, workloadCluster, currentSpec, newClusterSpec)
if err != nil {
return fmt.Errorf("error generating capi spec: %v", err)
}
if err = c.writeCAPISpecFile(newClusterSpec.ObjectMeta.Name, templater.AppendYamlResources(cpContent, mdContent)); err != nil {
return err
}
err = c.Retrier.Retry(
func() error {
return c.clusterClient.ApplyKubeSpecFromBytesWithNamespace(ctx, managementCluster, cpContent, constants.EksaSystemNamespace)
},
)
if err != nil {
return fmt.Errorf("error applying capi control plane spec: %v", err)
}
var externalEtcdTopology bool
if newClusterSpec.Spec.ExternalEtcdConfiguration != nil {
logger.V(3).Info("Waiting for external etcd to be ready after upgrade")
if err := c.clusterClient.WaitForManagedExternalEtcdReady(ctx, managementCluster, etcdWaitStr, newClusterSpec.Name); err != nil {
return fmt.Errorf("error waiting for external etcd for workload cluster to be ready: %v", err)
}
externalEtcdTopology = true
logger.V(3).Info("External etcd is ready")
}
logger.V(3).Info("Run post control plane upgrade operations")
err = provider.RunPostControlPlaneUpgrade(ctx, currentSpec, newClusterSpec, workloadCluster, managementCluster)
if err != nil {
return fmt.Errorf("error running post control plane upgrade operations: %v", err)
}
logger.V(3).Info("Waiting for control plane to be ready")
err = c.clusterClient.WaitForControlPlaneReady(ctx, managementCluster, ctrlPlaneWaitStr, newClusterSpec.Name)
if err != nil {
return fmt.Errorf("error waiting for workload cluster control plane to be ready: %v", err)
}
logger.V(3).Info("Waiting for control plane machines to be ready")
if err = c.waitForNodesReady(ctx, managementCluster, newClusterSpec.Name, []string{clusterv1.MachineControlPlaneLabelName}, types.WithNodeRef(), types.WithNodeHealthy()); err != nil {
return err
}
logger.V(3).Info("Waiting for control plane to be ready after upgrade")
err = c.clusterClient.WaitForControlPlaneReady(ctx, managementCluster, ctrlPlaneWaitStr, newClusterSpec.Name)
if err != nil {
return fmt.Errorf("error waiting for workload cluster control plane to be ready: %v", err)
}
logger.V(3).Info("Waiting for workload cluster control plane replicas to be ready after upgrade")
err = c.waitForControlPlaneReplicasReady(ctx, managementCluster, newClusterSpec)
if err != nil {
return fmt.Errorf("error waiting for workload cluster control plane replicas to be ready: %v", err)
}
err = c.Retrier.Retry(
func() error {
return c.clusterClient.ApplyKubeSpecFromBytesWithNamespace(ctx, managementCluster, mdContent, constants.EksaSystemNamespace)
},
)
if err != nil {
return fmt.Errorf("error applying capi machine deployment spec: %v", err)
}
logger.V(3).Info("Waiting for workload cluster machine deployment replicas to be ready after upgrade")
err = c.waitForMachineDeploymentReplicasReady(ctx, managementCluster, newClusterSpec)
if err != nil {
return fmt.Errorf("error waiting for workload cluster machinedeployment replicas to be ready: %v", err)
}
logger.V(3).Info("Waiting for machine deployment machines to be ready")
if err = c.waitForNodesReady(ctx, managementCluster, newClusterSpec.Name, []string{clusterv1.MachineDeploymentLabelName}, types.WithNodeRef(), types.WithNodeHealthy()); err != nil {
return err
}
logger.V(3).Info("Waiting for workload cluster capi components to be ready after upgrade")
err = c.waitForCAPI(ctx, workloadCluster, provider, externalEtcdTopology)
if err != nil {
return fmt.Errorf("error waiting for workload cluster capi components to be ready: %v", err)
}
if err = cluster.ApplyExtraObjects(ctx, c.clusterClient, workloadCluster, newClusterSpec); err != nil {
return fmt.Errorf("error applying extra resources to workload cluster: %v", err)
}
return nil
}