in pkg/clustermanager/cluster_manager.go [424:502]
func (c *ClusterManager) EKSAClusterSpecChanged(ctx context.Context, cluster *types.Cluster, newClusterSpec *cluster.Spec, datacenterConfig providers.DatacenterConfig, machineConfigs []providers.MachineConfig) (bool, error) {
cc, err := c.clusterClient.GetEksaCluster(ctx, cluster, newClusterSpec.Name)
if err != nil {
return false, err
}
if !cc.Equal(newClusterSpec.Cluster) {
logger.V(3).Info("Existing cluster and new cluster spec differ")
return true, nil
}
currentClusterSpec, err := c.buildSpecForCluster(ctx, cluster, cc)
if err != nil {
return false, err
}
if currentClusterSpec.VersionsBundle.EksD.Name != newClusterSpec.VersionsBundle.EksD.Name {
logger.V(3).Info("New eks-d release detected")
return true, nil
}
logger.V(3).Info("Clusters are the same, checking provider spec")
// compare provider spec
switch cc.Spec.DatacenterRef.Kind {
case v1alpha1.VSphereDatacenterKind:
machineConfigMap := make(map[string]*v1alpha1.VSphereMachineConfig)
existingVdc, err := c.clusterClient.GetEksaVSphereDatacenterConfig(ctx, cc.Spec.DatacenterRef.Name, cluster.KubeconfigFile, newClusterSpec.Namespace)
if err != nil {
return false, err
}
vdc := datacenterConfig.(*v1alpha1.VSphereDatacenterConfig)
if !reflect.DeepEqual(existingVdc.Spec, vdc.Spec) {
logger.V(3).Info("New provider spec is different from the new spec")
return true, nil
}
for _, config := range machineConfigs {
mc := config.(*v1alpha1.VSphereMachineConfig)
machineConfigMap[mc.Name] = mc
}
existingCpVmc, err := c.clusterClient.GetEksaVSphereMachineConfig(ctx, cc.Spec.ControlPlaneConfiguration.MachineGroupRef.Name, cluster.KubeconfigFile, newClusterSpec.Namespace)
if err != nil {
return false, err
}
cpVmc := machineConfigMap[newClusterSpec.Spec.ControlPlaneConfiguration.MachineGroupRef.Name]
if !reflect.DeepEqual(existingCpVmc.Spec, cpVmc.Spec) {
logger.V(3).Info("New control plane machine config spec is different from the existing spec")
return true, nil
}
for _, workerNodeGroupConfiguration := range cc.Spec.WorkerNodeGroupConfigurations {
existingWnVmc, err := c.clusterClient.GetEksaVSphereMachineConfig(ctx, workerNodeGroupConfiguration.MachineGroupRef.Name, cluster.KubeconfigFile, newClusterSpec.Namespace)
if err != nil {
return false, err
}
wnVmc := machineConfigMap[workerNodeGroupConfiguration.MachineGroupRef.Name]
if !reflect.DeepEqual(existingWnVmc.Spec, wnVmc.Spec) {
logger.V(3).Info("New worker node machine config spec is different from the existing spec")
return true, nil
}
}
if cc.Spec.ExternalEtcdConfiguration != nil {
existingEtcdVmc, err := c.clusterClient.GetEksaVSphereMachineConfig(ctx, cc.Spec.ExternalEtcdConfiguration.MachineGroupRef.Name, cluster.KubeconfigFile, newClusterSpec.Namespace)
if err != nil {
return false, err
}
etcdVmc := machineConfigMap[newClusterSpec.Spec.ExternalEtcdConfiguration.MachineGroupRef.Name]
if !reflect.DeepEqual(existingEtcdVmc.Spec, etcdVmc.Spec) {
logger.V(3).Info("New etcd machine config spec is different from the existing spec")
return true, nil
}
}
default:
// Run upgrade flow
return true, nil
}
return false, nil
}