in pkg/providers/cloudstack/template.go [109:287]
func buildTemplateMapCP(clusterSpec *cluster.Spec) (map[string]interface{}, error) {
datacenterConfigSpec := clusterSpec.CloudStackDatacenter.Spec
versionsBundle := clusterSpec.RootVersionsBundle()
format := "cloud-config"
host, port, err := getValidControlPlaneHostPort(clusterSpec.Cluster.Spec.ControlPlaneConfiguration.Endpoint.Host)
if err != nil {
return nil, err
}
etcdExtraArgs := clusterapi.SecureEtcdTlsCipherSuitesExtraArgs()
sharedExtraArgs := clusterapi.SecureTlsCipherSuitesExtraArgs()
apiServerExtraArgs := clusterapi.OIDCToExtraArgs(clusterSpec.OIDCConfig).
Append(clusterapi.AwsIamAuthExtraArgs(clusterSpec.AWSIamConfig)).
Append(clusterapi.APIServerExtraArgs(clusterSpec.Cluster.Spec.ControlPlaneConfiguration.APIServerExtraArgs)).
Append(clusterapi.EtcdEncryptionExtraArgs(clusterSpec.Cluster.Spec.EtcdEncryption)).
Append(sharedExtraArgs)
clusterapi.SetPodIAMAuthExtraArgs(clusterSpec.Cluster.Spec.PodIAMConfig, apiServerExtraArgs)
controllerManagerExtraArgs := clusterapi.SecureTlsCipherSuitesExtraArgs().
Append(clusterapi.NodeCIDRMaskExtraArgs(&clusterSpec.Cluster.Spec.ClusterNetwork))
controlPlaneMachineSpec := controlPlaneMachineConfig(clusterSpec).Spec
controlPlaneSSHKey, err := common.StripSshAuthorizedKeyComment(controlPlaneMachineSpec.Users[0].SshAuthorizedKeys[0])
if err != nil {
return nil, fmt.Errorf("formatting ssh key for cloudstack control plane template: %v", err)
}
var etcdMachineSpec v1alpha1.CloudStackMachineConfigSpec
var etcdSSHAuthorizedKey string
if clusterSpec.Cluster.Spec.ExternalEtcdConfiguration != nil {
etcdMachineSpec = etcdMachineConfig(clusterSpec).Spec
etcdSSHAuthorizedKey, err = common.StripSshAuthorizedKeyComment(etcdMachineSpec.Users[0].SshAuthorizedKeys[0])
if err != nil {
return nil, fmt.Errorf("formatting ssh key for cloudstack etcd template: %v", err)
}
}
values := map[string]interface{}{
"clusterName": clusterSpec.Cluster.Name,
"controlPlaneEndpointHost": host,
"controlPlaneEndpointPort": port,
"controlPlaneReplicas": clusterSpec.Cluster.Spec.ControlPlaneConfiguration.Count,
"apiServerCertSANs": clusterSpec.Cluster.Spec.ControlPlaneConfiguration.CertSANs,
"kubernetesRepository": versionsBundle.KubeDistro.Kubernetes.Repository,
"kubernetesVersion": versionsBundle.KubeDistro.Kubernetes.Tag,
"etcdRepository": versionsBundle.KubeDistro.Etcd.Repository,
"etcdImageTag": versionsBundle.KubeDistro.Etcd.Tag,
"corednsRepository": versionsBundle.KubeDistro.CoreDNS.Repository,
"corednsVersion": versionsBundle.KubeDistro.CoreDNS.Tag,
"nodeDriverRegistrarImage": versionsBundle.KubeDistro.NodeDriverRegistrar.VersionedImage(),
"livenessProbeImage": versionsBundle.KubeDistro.LivenessProbe.VersionedImage(),
"externalAttacherImage": versionsBundle.KubeDistro.ExternalAttacher.VersionedImage(),
"externalProvisionerImage": versionsBundle.KubeDistro.ExternalProvisioner.VersionedImage(),
"managerImage": versionsBundle.CloudStack.ClusterAPIController.VersionedImage(),
"kubeRbacProxyImage": versionsBundle.CloudStack.KubeRbacProxy.VersionedImage(),
"kubeVipImage": versionsBundle.CloudStack.KubeVip.VersionedImage(),
"cloudstackKubeVip": !features.IsActive(features.CloudStackKubeVipDisabled()),
"cloudstackAvailabilityZones": datacenterConfigSpec.AvailabilityZones,
"cloudstackAnnotationSuffix": constants.CloudstackAnnotationSuffix,
"cloudstackControlPlaneComputeOfferingId": controlPlaneMachineSpec.ComputeOffering.Id,
"cloudstackControlPlaneComputeOfferingName": controlPlaneMachineSpec.ComputeOffering.Name,
"cloudstackControlPlaneTemplateOfferingId": controlPlaneMachineSpec.Template.Id,
"cloudstackControlPlaneTemplateOfferingName": controlPlaneMachineSpec.Template.Name,
"cloudstackControlPlaneCustomDetails": controlPlaneMachineSpec.UserCustomDetails,
"cloudstackControlPlaneSymlinks": controlPlaneMachineSpec.Symlinks,
"cloudstackControlPlaneAffinity": controlPlaneMachineSpec.Affinity,
"cloudstackControlPlaneAffinityGroupIds": controlPlaneMachineSpec.AffinityGroupIds,
"cloudstackEtcdComputeOfferingId": etcdMachineSpec.ComputeOffering.Id,
"cloudstackEtcdComputeOfferingName": etcdMachineSpec.ComputeOffering.Name,
"cloudstackEtcdTemplateOfferingId": etcdMachineSpec.Template.Id,
"cloudstackEtcdTemplateOfferingName": etcdMachineSpec.Template.Name,
"cloudstackEtcdCustomDetails": etcdMachineSpec.UserCustomDetails,
"cloudstackEtcdSymlinks": etcdMachineSpec.Symlinks,
"cloudstackEtcdAffinity": etcdMachineSpec.Affinity,
"cloudstackEtcdAffinityGroupIds": etcdMachineSpec.AffinityGroupIds,
"controlPlaneSshUsername": controlPlaneMachineSpec.Users[0].Name,
"cloudstackControlPlaneSshAuthorizedKey": controlPlaneSSHKey,
"cloudstackEtcdSshAuthorizedKey": etcdSSHAuthorizedKey,
"podCidrs": clusterSpec.Cluster.Spec.ClusterNetwork.Pods.CidrBlocks,
"serviceCidrs": clusterSpec.Cluster.Spec.ClusterNetwork.Services.CidrBlocks,
"apiserverExtraArgs": apiServerExtraArgs.ToPartialYaml(),
"etcdExtraArgs": etcdExtraArgs.ToPartialYaml(),
"etcdCipherSuites": crypto.SecureCipherSuitesString(),
"controllermanagerExtraArgs": controllerManagerExtraArgs.ToPartialYaml(),
"schedulerExtraArgs": sharedExtraArgs.ToPartialYaml(),
"format": format,
"externalEtcdVersion": versionsBundle.KubeDistro.EtcdVersion,
"externalEtcdReleaseUrl": versionsBundle.KubeDistro.EtcdURL,
"etcdImage": versionsBundle.KubeDistro.EtcdImage.VersionedImage(),
"eksaSystemNamespace": constants.EksaSystemNamespace,
}
auditPolicy, err := common.GetAuditPolicy(clusterSpec.Cluster.Spec.KubernetesVersion)
if err != nil {
return nil, err
}
values["auditPolicy"] = auditPolicy
fillDiskOffering(values, controlPlaneMachineSpec.DiskOffering, "ControlPlane")
fillDiskOffering(values, etcdMachineSpec.DiskOffering, "Etcd")
values["cloudstackControlPlaneAnnotations"] = values["cloudstackControlPlaneDiskOfferingProvided"].(bool) || len(controlPlaneMachineSpec.Symlinks) > 0
values["cloudstackEtcdAnnotations"] = values["cloudstackEtcdDiskOfferingProvided"].(bool) || len(etcdMachineSpec.Symlinks) > 0
if clusterSpec.Cluster.Spec.RegistryMirrorConfiguration != nil {
registryMirror := registrymirror.FromCluster(clusterSpec.Cluster)
values["registryMirrorMap"] = containerd.ToAPIEndpoints(registryMirror.NamespacedRegistryMap)
values["mirrorBase"] = registryMirror.BaseRegistry
values["insecureSkip"] = registryMirror.InsecureSkipVerify
values["publicMirror"] = containerd.ToAPIEndpoint(registryMirror.CoreEKSAMirror())
if len(registryMirror.CACertContent) > 0 {
values["registryCACert"] = registryMirror.CACertContent
}
}
if clusterSpec.Cluster.Spec.ProxyConfiguration != nil {
fillProxyConfigurations(values, clusterSpec, net.JoinHostPort(host, port))
}
if clusterSpec.Cluster.Spec.ExternalEtcdConfiguration != nil {
values["externalEtcd"] = true
values["externalEtcdReplicas"] = clusterSpec.Cluster.Spec.ExternalEtcdConfiguration.Count
values["etcdSshUsername"] = etcdMachineSpec.Users[0].Name
etcdURL, _ := common.GetExternalEtcdReleaseURL(clusterSpec.Cluster.Spec.EksaVersion, versionsBundle)
if etcdURL != "" {
values["externalEtcdReleaseUrl"] = etcdURL
}
}
if len(clusterSpec.Cluster.Spec.ControlPlaneConfiguration.Taints) > 0 {
values["controlPlaneTaints"] = clusterSpec.Cluster.Spec.ControlPlaneConfiguration.Taints
}
if clusterSpec.AWSIamConfig != nil {
values["awsIamAuth"] = true
}
if clusterSpec.Cluster.Spec.ControlPlaneConfiguration.UpgradeRolloutStrategy != nil {
values["upgradeRolloutStrategy"] = true
values["maxSurge"] = clusterSpec.Cluster.Spec.ControlPlaneConfiguration.UpgradeRolloutStrategy.RollingUpdate.MaxSurge
}
if clusterSpec.Cluster.Spec.EtcdEncryption != nil && len(*clusterSpec.Cluster.Spec.EtcdEncryption) != 0 {
conf, err := common.GenerateKMSEncryptionConfiguration(clusterSpec.Cluster.Spec.EtcdEncryption)
if err != nil {
return nil, err
}
values["encryptionProviderConfig"] = conf
}
if clusterSpec.Cluster.Spec.ControlPlaneConfiguration.KubeletConfiguration != nil {
cpKubeletConfig := clusterSpec.Cluster.Spec.ControlPlaneConfiguration.KubeletConfiguration.Object
if _, ok := cpKubeletConfig["tlsCipherSuites"]; !ok {
cpKubeletConfig["tlsCipherSuites"] = crypto.SecureCipherSuiteNames()
}
if _, ok := cpKubeletConfig["resolvConf"]; !ok {
if clusterSpec.Cluster.Spec.ClusterNetwork.DNS.ResolvConf != nil {
cpKubeletConfig["resolvConf"] = clusterSpec.Cluster.Spec.ClusterNetwork.DNS.ResolvConf.Path
}
}
kcString, err := yaml.Marshal(cpKubeletConfig)
if err != nil {
return nil, fmt.Errorf("error marshaling %v", err)
}
values["kubeletConfiguration"] = string(kcString)
} else {
kubeletExtraArgs := clusterapi.SecureTlsCipherSuitesExtraArgs().
Append(clusterapi.ResolvConfExtraArgs(clusterSpec.Cluster.Spec.ClusterNetwork.DNS.ResolvConf))
values["kubeletExtraArgs"] = kubeletExtraArgs.ToPartialYaml()
}
nodeLabelArgs := clusterapi.ControlPlaneNodeLabelsExtraArgs(clusterSpec.Cluster.Spec.ControlPlaneConfiguration)
if len(nodeLabelArgs) != 0 {
values["nodeLabelArgs"] = nodeLabelArgs.ToPartialYaml()
}
return values, nil
}