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