Refactoring around generatePodTemplate.
This commit is contained in:
parent
1e4f046797
commit
a2bce26fd8
|
|
@ -310,19 +310,84 @@ func isBootstrapOnlyParameter(param string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) generatePodTemplate(
|
func (c *Cluster) generatePodTemplate(
|
||||||
uid types.UID,
|
|
||||||
resourceRequirements *v1.ResourceRequirements,
|
resourceRequirements *v1.ResourceRequirements,
|
||||||
resourceRequirementsScalyrSidecar *v1.ResourceRequirements,
|
envVars []v1.EnvVar,
|
||||||
tolerationsSpec *[]v1.Toleration,
|
tolerationsSpec *[]v1.Toleration,
|
||||||
pgParameters *spec.PostgresqlParam,
|
|
||||||
patroniParameters *spec.Patroni,
|
|
||||||
cloneDescription *spec.CloneDescription,
|
|
||||||
dockerImage *string,
|
dockerImage *string,
|
||||||
sidecars []spec.Sidecar,
|
sidecars []spec.Sidecar,
|
||||||
customPodEnvVars map[string]string,
|
|
||||||
) (*v1.PodTemplateSpec, error) {
|
) (*v1.PodTemplateSpec, error) {
|
||||||
spiloConfiguration := c.generateSpiloJSONConfiguration(pgParameters, patroniParameters)
|
|
||||||
|
|
||||||
|
privilegedMode := true
|
||||||
|
volumeMounts := []v1.VolumeMount{
|
||||||
|
{
|
||||||
|
Name: constants.DataVolumeName,
|
||||||
|
MountPath: constants.PostgresDataMount, //TODO: fetch from manifest
|
||||||
|
},
|
||||||
|
}
|
||||||
|
container := v1.Container{
|
||||||
|
Name: c.containerName(),
|
||||||
|
Image: *dockerImage,
|
||||||
|
ImagePullPolicy: v1.PullIfNotPresent,
|
||||||
|
Resources: *resourceRequirements,
|
||||||
|
Ports: []v1.ContainerPort{
|
||||||
|
{
|
||||||
|
ContainerPort: 8008,
|
||||||
|
Protocol: v1.ProtocolTCP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ContainerPort: 5432,
|
||||||
|
Protocol: v1.ProtocolTCP,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ContainerPort: 8080,
|
||||||
|
Protocol: v1.ProtocolTCP,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
VolumeMounts: volumeMounts,
|
||||||
|
Env: envVars,
|
||||||
|
SecurityContext: &v1.SecurityContext{
|
||||||
|
Privileged: &privilegedMode,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
terminateGracePeriodSeconds := int64(c.OpConfig.PodTerminateGracePeriod.Seconds())
|
||||||
|
|
||||||
|
podSpec := v1.PodSpec{
|
||||||
|
ServiceAccountName: c.OpConfig.PodServiceAccountName,
|
||||||
|
TerminationGracePeriodSeconds: &terminateGracePeriodSeconds,
|
||||||
|
Containers: []v1.Container{container},
|
||||||
|
Tolerations: c.tolerations(tolerationsSpec),
|
||||||
|
}
|
||||||
|
|
||||||
|
if affinity := c.nodeAffinity(); affinity != nil {
|
||||||
|
podSpec.Affinity = affinity
|
||||||
|
}
|
||||||
|
|
||||||
|
if sidecars != nil && len(sidecars) > 0 {
|
||||||
|
for index, sidecar := range sidecars {
|
||||||
|
sc, err := c.getSidecarContainer(sidecar, index, volumeMounts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
podSpec.Containers = append(podSpec.Containers, *sc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template := v1.PodTemplateSpec{
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Labels: c.labelsSet(true),
|
||||||
|
Namespace: c.Namespace,
|
||||||
|
},
|
||||||
|
Spec: podSpec,
|
||||||
|
}
|
||||||
|
if c.OpConfig.KubeIAMRole != "" {
|
||||||
|
template.Annotations = map[string]string{constants.KubeIAmAnnotation: c.OpConfig.KubeIAMRole}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &template, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// generatePodEnvVars generates environment variables for the Spilo Pod
|
||||||
|
func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration string, cloneDescription *spec.CloneDescription, customPodEnvVars map[string]string) []v1.EnvVar {
|
||||||
envVars := []v1.EnvVar{
|
envVars := []v1.EnvVar{
|
||||||
{
|
{
|
||||||
Name: "SCOPE",
|
Name: "SCOPE",
|
||||||
|
|
@ -431,123 +496,7 @@ func (c *Cluster) generatePodTemplate(
|
||||||
for _, name := range names {
|
for _, name := range names {
|
||||||
envVars = append(envVars, v1.EnvVar{Name: name, Value: customPodEnvVars[name]})
|
envVars = append(envVars, v1.EnvVar{Name: name, Value: customPodEnvVars[name]})
|
||||||
}
|
}
|
||||||
|
return envVars
|
||||||
privilegedMode := true
|
|
||||||
containerImage := c.OpConfig.DockerImage
|
|
||||||
if dockerImage != nil && *dockerImage != "" {
|
|
||||||
containerImage = *dockerImage
|
|
||||||
}
|
|
||||||
volumeMounts := []v1.VolumeMount{
|
|
||||||
{
|
|
||||||
Name: constants.DataVolumeName,
|
|
||||||
MountPath: constants.PostgresDataMount, //TODO: fetch from manifest
|
|
||||||
},
|
|
||||||
}
|
|
||||||
container := v1.Container{
|
|
||||||
Name: c.containerName(),
|
|
||||||
Image: containerImage,
|
|
||||||
ImagePullPolicy: v1.PullIfNotPresent,
|
|
||||||
Resources: *resourceRequirements,
|
|
||||||
Ports: []v1.ContainerPort{
|
|
||||||
{
|
|
||||||
ContainerPort: 8008,
|
|
||||||
Protocol: v1.ProtocolTCP,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ContainerPort: 5432,
|
|
||||||
Protocol: v1.ProtocolTCP,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ContainerPort: 8080,
|
|
||||||
Protocol: v1.ProtocolTCP,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
VolumeMounts: volumeMounts,
|
|
||||||
Env: envVars,
|
|
||||||
SecurityContext: &v1.SecurityContext{
|
|
||||||
Privileged: &privilegedMode,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
terminateGracePeriodSeconds := int64(c.OpConfig.PodTerminateGracePeriod.Seconds())
|
|
||||||
|
|
||||||
podSpec := v1.PodSpec{
|
|
||||||
ServiceAccountName: c.OpConfig.PodServiceAccountName,
|
|
||||||
TerminationGracePeriodSeconds: &terminateGracePeriodSeconds,
|
|
||||||
Containers: []v1.Container{container},
|
|
||||||
Tolerations: c.tolerations(tolerationsSpec),
|
|
||||||
}
|
|
||||||
|
|
||||||
if affinity := c.nodeAffinity(); affinity != nil {
|
|
||||||
podSpec.Affinity = affinity
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.OpConfig.ScalyrAPIKey != "" && c.OpConfig.ScalyrImage != "" {
|
|
||||||
podSpec.Containers = append(
|
|
||||||
podSpec.Containers,
|
|
||||||
v1.Container{
|
|
||||||
Name: "scalyr-sidecar",
|
|
||||||
Image: c.OpConfig.ScalyrImage,
|
|
||||||
ImagePullPolicy: v1.PullIfNotPresent,
|
|
||||||
Resources: *resourceRequirementsScalyrSidecar,
|
|
||||||
VolumeMounts: volumeMounts,
|
|
||||||
Env: []v1.EnvVar{
|
|
||||||
{
|
|
||||||
Name: "POD_NAME",
|
|
||||||
ValueFrom: &v1.EnvVarSource{
|
|
||||||
FieldRef: &v1.ObjectFieldSelector{
|
|
||||||
APIVersion: "v1",
|
|
||||||
FieldPath: "metadata.name",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "POD_NAMESPACE",
|
|
||||||
ValueFrom: &v1.EnvVarSource{
|
|
||||||
FieldRef: &v1.ObjectFieldSelector{
|
|
||||||
APIVersion: "v1",
|
|
||||||
FieldPath: "metadata.namespace",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "SCALYR_API_KEY",
|
|
||||||
Value: c.OpConfig.ScalyrAPIKey,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "SCALYR_SERVER_HOST",
|
|
||||||
Value: c.Name,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Name: "SCALYR_SERVER_URL",
|
|
||||||
Value: c.OpConfig.ScalyrServerURL,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if sidecars != nil && len(sidecars) > 0 {
|
|
||||||
for index, sidecar := range sidecars {
|
|
||||||
sc, err := c.getSidecarContainer(sidecar, index, volumeMounts)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
podSpec.Containers = append(podSpec.Containers, *sc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template := v1.PodTemplateSpec{
|
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Labels: c.labelsSet(true),
|
|
||||||
Namespace: c.Namespace,
|
|
||||||
},
|
|
||||||
Spec: podSpec,
|
|
||||||
}
|
|
||||||
if c.OpConfig.KubeIAMRole != "" {
|
|
||||||
template.Annotations = map[string]string{constants.KubeIAmAnnotation: c.OpConfig.KubeIAMRole}
|
|
||||||
}
|
|
||||||
|
|
||||||
return &template, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) getSidecarContainer(sidecar spec.Sidecar, index int, volumeMounts []v1.VolumeMount) (*v1.Container, error) {
|
func (c *Cluster) getSidecarContainer(sidecar spec.Sidecar, index int, volumeMounts []v1.VolumeMount) (*v1.Container, error) {
|
||||||
|
|
@ -640,13 +589,11 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not generate resource requirements: %v", err)
|
return nil, fmt.Errorf("could not generate resource requirements: %v", err)
|
||||||
}
|
}
|
||||||
resourceRequirementsScalyrSidecar, err := c.resourceRequirements(
|
resourceRequirementsScalyrSidecar := makeResources(
|
||||||
makeResources(
|
c.OpConfig.ScalyrCPURequest,
|
||||||
c.OpConfig.ScalyrCPURequest,
|
c.OpConfig.ScalyrMemoryRequest,
|
||||||
c.OpConfig.ScalyrMemoryRequest,
|
c.OpConfig.ScalyrCPULimit,
|
||||||
c.OpConfig.ScalyrCPULimit,
|
c.OpConfig.ScalyrMemoryLimit,
|
||||||
c.OpConfig.ScalyrMemoryLimit,
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not generate Scalyr sidecar resource requirements: %v", err)
|
return nil, fmt.Errorf("could not generate Scalyr sidecar resource requirements: %v", err)
|
||||||
|
|
@ -660,9 +607,27 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mergedSidecars := c.mergeSidecars(spec.Sidecars)
|
spiloConfiguration := c.generateSpiloJSONConfiguration(&spec.PostgresqlParam, &spec.Patroni)
|
||||||
|
envVars := c.generateSpiloPodEnvVars(c.Postgresql.GetUID(), spiloConfiguration, &spec.Clone, customPodEnvVars)
|
||||||
|
|
||||||
|
sideCars := c.mergeSidecars(spec.Sidecars)
|
||||||
|
if scalarSidecar, present :=
|
||||||
|
generateScalarSidecarSpec(c.Name,
|
||||||
|
c.OpConfig.ScalyrAPIKey,
|
||||||
|
c.OpConfig.ScalyrServerURL,
|
||||||
|
c.OpConfig.ScalyrImage,
|
||||||
|
&resourceRequirementsScalyrSidecar); present {
|
||||||
|
sideCars = append(sideCars, *scalarSidecar)
|
||||||
|
}
|
||||||
|
effectiveDockerImage := getEffectiveDockerImage(c.OpConfig.DockerImage, spec.DockerImage)
|
||||||
|
|
||||||
|
podTemplate, err := c.generatePodTemplate(
|
||||||
|
resourceRequirements,
|
||||||
|
envVars,
|
||||||
|
&spec.Tolerations,
|
||||||
|
&effectiveDockerImage,
|
||||||
|
sideCars)
|
||||||
|
|
||||||
podTemplate, err := c.generatePodTemplate(c.Postgresql.GetUID(), resourceRequirements, resourceRequirementsScalyrSidecar, &spec.Tolerations, &spec.PostgresqlParam, &spec.Patroni, &spec.Clone, &spec.DockerImage, mergedSidecars, customPodEnvVars)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not generate pod template: %v", err)
|
return nil, fmt.Errorf("could not generate pod template: %v", err)
|
||||||
}
|
}
|
||||||
|
|
@ -692,6 +657,56 @@ func (c *Cluster) generateStatefulSet(spec *spec.PostgresSpec) (*v1beta1.Statefu
|
||||||
return statefulSet, nil
|
return statefulSet, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getEffectiveDockerImage(globalDockerImage, clusterDockerImage string) string {
|
||||||
|
if clusterDockerImage == "" {
|
||||||
|
return globalDockerImage
|
||||||
|
}
|
||||||
|
return clusterDockerImage
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateScalarSidecarSpec(clusterName, APIKey, serverURL, dockerImage string, containerResources *spec.Resources) (sidecar *spec.Sidecar, present bool) {
|
||||||
|
if APIKey == "" || serverURL == "" || dockerImage == "" {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return &spec.Sidecar{
|
||||||
|
Name: "scalyr-sidecar",
|
||||||
|
DockerImage: dockerImage,
|
||||||
|
Env: []v1.EnvVar{
|
||||||
|
{
|
||||||
|
Name: "POD_NAME",
|
||||||
|
ValueFrom: &v1.EnvVarSource{
|
||||||
|
FieldRef: &v1.ObjectFieldSelector{
|
||||||
|
APIVersion: "v1",
|
||||||
|
FieldPath: "metadata.name",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "POD_NAMESPACE",
|
||||||
|
ValueFrom: &v1.EnvVarSource{
|
||||||
|
FieldRef: &v1.ObjectFieldSelector{
|
||||||
|
APIVersion: "v1",
|
||||||
|
FieldPath: "metadata.namespace",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "SCALYR_API_KEY",
|
||||||
|
Value: APIKey,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "SCALYR_SERVER_HOST",
|
||||||
|
Value: clusterName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "SCALYR_SERVER_URL",
|
||||||
|
Value: serverURL,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Resources: *containerResources,
|
||||||
|
}, true
|
||||||
|
}
|
||||||
|
|
||||||
// mergeSidecar merges globally-defined sidecars with those defined in the cluster manifest
|
// mergeSidecar merges globally-defined sidecars with those defined in the cluster manifest
|
||||||
func (c *Cluster) mergeSidecars(sidecars []spec.Sidecar) []spec.Sidecar {
|
func (c *Cluster) mergeSidecars(sidecars []spec.Sidecar) []spec.Sidecar {
|
||||||
globalSidecarsToSkip := map[string]bool{}
|
globalSidecarsToSkip := map[string]bool{}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue