in controllers/controllers/resource/template.go [49:146]
func (r *VsphereTemplate) TemplateResources(ctx context.Context, eksaCluster *anywherev1.Cluster, clusterSpec *cluster.Spec, vdc anywherev1.VSphereDatacenterConfig, cpVmc, etcdVmc anywherev1.VSphereMachineConfig, workerVmcs map[string]anywherev1.VSphereMachineConfig) ([]*unstructured.Unstructured, error) {
workerNodeGroupMachineSpecs := make(map[string]anywherev1.VSphereMachineConfigSpec, len(workerVmcs))
for _, wnConfig := range clusterSpec.Spec.WorkerNodeGroupConfigurations {
workerNodeGroupMachineSpecs[wnConfig.MachineGroupRef.Name] = workerVmcs[wnConfig.MachineGroupRef.Name].Spec
}
// control plane and etcd updates are prohibited in controller so those specs should not change
templateBuilder := vsphere.NewVsphereTemplateBuilder(&vdc.Spec, &cpVmc.Spec, &etcdVmc.Spec, workerNodeGroupMachineSpecs, r.now, true)
clusterName := clusterSpec.ObjectMeta.Name
oldVdc, err := r.ExistingVSphereDatacenterConfig(ctx, eksaCluster, clusterSpec.Spec.WorkerNodeGroupConfigurations[0])
if err != nil {
return nil, err
}
oldCpVmc, err := r.ExistingVSphereControlPlaneMachineConfig(ctx, eksaCluster)
if err != nil {
return nil, err
}
var controlPlaneTemplateName string
updateControlPlaneTemplate := vsphere.AnyImmutableFieldChanged(oldVdc, &vdc, oldCpVmc, &cpVmc)
if updateControlPlaneTemplate {
controlPlaneTemplateName = templateBuilder.CPMachineTemplateName(clusterName)
} else {
cp, err := r.ControlPlane(ctx, eksaCluster)
if err != nil {
return nil, err
}
controlPlaneTemplateName = cp.Spec.MachineTemplate.InfrastructureRef.Name
}
workloadTemplateNames := make(map[string]string, len(clusterSpec.Spec.WorkerNodeGroupConfigurations))
for _, workerNodeGroupConfiguration := range clusterSpec.Spec.WorkerNodeGroupConfigurations {
oldVmc, err := r.ExistingVSphereWorkerMachineConfig(ctx, eksaCluster, workerNodeGroupConfiguration)
if err != nil {
return nil, err
}
vmc := workerVmcs[workerNodeGroupConfiguration.MachineGroupRef.Name]
updateWorkloadTemplate := vsphere.AnyImmutableFieldChanged(oldVdc, &vdc, oldVmc, &vmc)
if updateWorkloadTemplate {
workloadTemplateName := templateBuilder.WorkerMachineTemplateName(clusterName, workerNodeGroupConfiguration.Name)
workloadTemplateNames[workerNodeGroupConfiguration.Name] = workloadTemplateName
} else {
mcDeployment, err := r.MachineDeployment(ctx, eksaCluster, workerNodeGroupConfiguration)
if err != nil {
return nil, err
}
workloadTemplateName := mcDeployment.Spec.Template.Spec.InfrastructureRef.Name
workloadTemplateNames[workerNodeGroupConfiguration.Name] = workloadTemplateName
}
}
var etcdTemplateName string
if eksaCluster.Spec.ExternalEtcdConfiguration != nil {
oldEtcdVmc, err := r.ExistingVSphereEtcdMachineConfig(ctx, eksaCluster)
if err != nil {
return nil, err
}
updateEtcdTemplate := vsphere.AnyImmutableFieldChanged(oldVdc, &vdc, oldEtcdVmc, &etcdVmc)
etcd, err := r.Etcd(ctx, eksaCluster)
if err != nil {
return nil, err
}
if updateEtcdTemplate {
etcd.SetAnnotations(map[string]string{etcdv1.UpgradeInProgressAnnotation: "true"})
if err := r.ApplyPatch(ctx, etcd, false); err != nil {
return nil, err
}
etcdTemplateName = templateBuilder.EtcdMachineTemplateName(clusterName)
} else {
etcdTemplateName = etcd.Spec.InfrastructureTemplate.Name
}
}
// Get vsphere credentials so that the template can apply correctly instead of with empty values
credSecret, err := r.VSphereCredentials(ctx)
if err != nil {
return nil, err
}
usernameBytes, ok := credSecret.Data["username"]
if !ok {
return nil, fmt.Errorf("unable to retrieve username from secret")
}
passwordBytes, ok := credSecret.Data["password"]
if !ok {
return nil, fmt.Errorf("unable to retrieve password from secret")
}
cpOpt := func(values map[string]interface{}) {
values["controlPlaneTemplateName"] = controlPlaneTemplateName
values["vsphereControlPlaneSshAuthorizedKey"] = sshAuthorizedKey(cpVmc.Spec.Users)
values["vsphereEtcdSshAuthorizedKey"] = sshAuthorizedKey(etcdVmc.Spec.Users)
values["etcdTemplateName"] = etcdTemplateName
values["eksaVsphereUsername"] = string(usernameBytes)
values["eksaVspherePassword"] = string(passwordBytes)
}
return generateTemplateResources(templateBuilder, clusterSpec, workloadTemplateNames, cpOpt)
}