Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions pkg/cluster/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import (
"k8s.io/client-go/tools/remotecommand"

"github.com/zalando/postgres-operator/pkg/spec"
"github.com/zalando/postgres-operator/pkg/util/constants"
)

//ExecCommand executes arbitrary command inside the pod
Expand All @@ -32,14 +31,14 @@ func (c *Cluster) ExecCommand(podName *spec.NamespacedName, command ...string) (
// iterate through all containers looking for the one running PostgreSQL.
targetContainer := -1
for i, cr := range pod.Spec.Containers {
if cr.Name == constants.PostgresContainerName {
if cr.Name == c.containerName() {
targetContainer = i
break
}
}

if targetContainer < 0 {
return "", fmt.Errorf("could not find %s container to exec to", constants.PostgresContainerName)
return "", fmt.Errorf("could not find %s container to exec to", c.containerName())
}

req := c.KubeClient.RESTClient.Post().
Expand Down
62 changes: 35 additions & 27 deletions pkg/cluster/k8sres.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ type spiloConfiguration struct {
}

func (c *Cluster) containerName() string {
return "postgres"
return constants.PostgresContainerName
}

func (c *Cluster) statefulSetName() string {
Expand Down Expand Up @@ -1401,14 +1401,18 @@ func addShmVolume(podSpec *v1.PodSpec) {
},
})

pgIdx := constants.PostgresContainerIdx
mounts := append(podSpec.Containers[pgIdx].VolumeMounts,
v1.VolumeMount{
Name: constants.ShmVolumeName,
MountPath: constants.ShmVolumePath,
})
for i, container := range podSpec.Containers {
if container.Name == constants.PostgresContainerName {
mounts := append(container.VolumeMounts,
v1.VolumeMount{
Name: constants.ShmVolumeName,
MountPath: constants.ShmVolumePath,
})

podSpec.Containers[i].VolumeMounts = mounts
}
}

podSpec.Containers[0].VolumeMounts = mounts
podSpec.Volumes = volumes
}

Expand Down Expand Up @@ -1439,54 +1443,58 @@ func (c *Cluster) addAdditionalVolumes(podSpec *v1.PodSpec,

volumes := podSpec.Volumes
mountPaths := map[string]acidv1.AdditionalVolume{}
for i, v := range additionalVolumes {
if previousVolume, exist := mountPaths[v.MountPath]; exist {
for i, additionalVolume := range additionalVolumes {
if previousVolume, exist := mountPaths[additionalVolume.MountPath]; exist {
msg := "Volume %+v cannot be mounted to the same path as %+v"
c.logger.Warningf(msg, v, previousVolume)
c.logger.Warningf(msg, additionalVolume, previousVolume)
continue
}

if v.MountPath == constants.PostgresDataMount {
if additionalVolume.MountPath == constants.PostgresDataMount {
msg := "Cannot mount volume on postgresql data directory, %+v"
c.logger.Warningf(msg, v)
c.logger.Warningf(msg, additionalVolume)
continue
}

if len(v.TargetContainers) == 0 {
spiloContainer := podSpec.Containers[0]
additionalVolumes[i].TargetContainers = []string{spiloContainer.Name}
// if no target container is defined assign it to postgres container
if len(additionalVolume.TargetContainers) == 0 {
for j := range podSpec.Containers {
if podSpec.Containers[j].Name == c.containerName() {
additionalVolumes[i].TargetContainers = []string{c.containerName()}
}
}
}

for _, target := range v.TargetContainers {
if target == "all" && len(v.TargetContainers) != 1 {
for _, target := range additionalVolume.TargetContainers {
if target == "all" && len(additionalVolume.TargetContainers) != 1 {
msg := `Target containers could be either "all" or a list
of containers, mixing those is not allowed, %+v`
c.logger.Warningf(msg, v)
c.logger.Warningf(msg, additionalVolume)
continue
}
}

volumes = append(volumes,
v1.Volume{
Name: v.Name,
VolumeSource: v.VolumeSource,
Name: additionalVolume.Name,
VolumeSource: additionalVolume.VolumeSource,
},
)

mountPaths[v.MountPath] = v
mountPaths[additionalVolume.MountPath] = additionalVolume
}

c.logger.Infof("Mount additional volumes: %+v", additionalVolumes)

for i := range podSpec.Containers {
mounts := podSpec.Containers[i].VolumeMounts
for _, v := range additionalVolumes {
for _, target := range v.TargetContainers {
for _, additionalVolume := range additionalVolumes {
for _, target := range additionalVolume.TargetContainers {
if podSpec.Containers[i].Name == target || target == "all" {
mounts = append(mounts, v1.VolumeMount{
Name: v.Name,
MountPath: v.MountPath,
SubPath: v.SubPath,
Name: additionalVolume.Name,
MountPath: additionalVolume.MountPath,
SubPath: additionalVolume.SubPath,
})
}
}
Expand Down
2 changes: 2 additions & 0 deletions pkg/cluster/k8sres_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ func TestShmVolume(t *testing.T) {
Volumes: []v1.Volume{},
Containers: []v1.Container{
{
Name: "postgres",
VolumeMounts: []v1.VolumeMount{},
},
},
Expand All @@ -425,6 +426,7 @@ func TestShmVolume(t *testing.T) {
Volumes: []v1.Volume{{}},
Containers: []v1.Container{
{
Name: "postgres",
VolumeMounts: []v1.VolumeMount{
{},
},
Expand Down
4 changes: 2 additions & 2 deletions pkg/cluster/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -357,8 +357,8 @@ func (c *Cluster) syncStatefulSet() error {
// and
// (b) some of the pods were not restarted when the lazy update was still in place
for _, pod := range pods {
effectivePodImage := pod.Spec.Containers[0].Image
stsImage := desiredSts.Spec.Template.Spec.Containers[0].Image
effectivePodImage := c.getPostgresContainer(&pod.Spec).Image
stsImage := c.getPostgresContainer(&desiredSts.Spec.Template.Spec).Image

if stsImage != effectivePodImage {
if err = c.markRollingUpdateFlagForPod(&pod, "pod not yet restarted due to lazy update"); err != nil {
Expand Down
10 changes: 10 additions & 0 deletions pkg/cluster/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,16 @@ func (c *Cluster) logServiceChanges(role PostgresRole, old, new *v1.Service, isU
}
}

func (c *Cluster) getPostgresContainer(podSpec *v1.PodSpec) v1.Container {
var pgContainer v1.Container
for _, container := range podSpec.Containers {
if container.Name == constants.PostgresContainerName {
pgContainer = container
}
}
return pgContainer
}

func (c *Cluster) getTeamMembers(teamID string) ([]string, error) {

if teamID == "" {
Expand Down
1 change: 0 additions & 1 deletion pkg/util/constants/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import "time"
// General kubernetes-related constants
const (
PostgresContainerName = "postgres"
PostgresContainerIdx = 0
K8sAPIPath = "/apis"

QueueResyncPeriodPod = 5 * time.Minute
Expand Down