Skip to content

Commit

Permalink
Add custom sidecar containers pod extension
Browse files Browse the repository at this point in the history
This new pod extension allows for additional containers to be added
to the primary Mattermost app pod.
  • Loading branch information
gabrieljackson committed Jan 1, 2024
1 parent 829dfe8 commit ce3fbb3
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 27 deletions.
8 changes: 6 additions & 2 deletions apis/mattermost/v1beta1/mattermost_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,11 +286,15 @@ type UpdateJob struct {

// PodExtensions specify customized extensions for a pod.
type PodExtensions struct {
// Additional InitContainers injected to pods.
// Additional InitContainers injected into pods.
// The setting does not override InitContainers defined by the Operator.
InitContainers []v1.Container `json:"initContainers,omitempty"`

// Additional Container Ports injected to pod's main container.
// Additional sidecar containers injected into pods.
// The setting does not override Sidecar containers defined by the Operator.
SidecarContainers []v1.Container `json:"sidecarContainers,omitempty"`

// Additional Container Ports injected into pod's main container.
// The setting does not override ContainerPorts defined by the Operator.
ContainerPorts []v1.ContainerPort `json:"containerPorts,omitempty"`
}
Expand Down
55 changes: 31 additions & 24 deletions pkg/mattermost/mattermost_v1beta.go
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,28 @@ func GenerateDeploymentV1Beta(mattermost *mmv1beta.Mattermost, db DatabaseConfig
revisionHistoryLimit = mattermost.Spec.DeploymentTemplate.RevisionHistoryLimit
}

containers := []corev1.Container{
{
Name: mattermostv1alpha1.MattermostAppContainerName,
Image: containerImage,
ImagePullPolicy: mattermost.Spec.ImagePullPolicy,
TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
Command: []string{"mattermost"},
Env: envVars,
Ports: containerPorts,
ReadinessProbe: readiness,
LivenessProbe: liveness,
VolumeMounts: volumeMounts,
Resources: mattermost.Spec.Scheduling.Resources,
SecurityContext: containerSecurityContext,
},
}

// Final container extensions
if mattermost.Spec.PodExtensions.SidecarContainers != nil {
containers = append(containers, mattermost.Spec.PodExtensions.SidecarContainers...)
}

return &appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: deploymentName,
Expand Down Expand Up @@ -394,30 +416,15 @@ func GenerateDeploymentV1Beta(mattermost *mmv1beta.Mattermost, db DatabaseConfig
Spec: corev1.PodSpec{
ServiceAccountName: serviceAccountName,
InitContainers: initContainers,
Containers: []corev1.Container{
{
Name: mattermostv1alpha1.MattermostAppContainerName,
Image: containerImage,
ImagePullPolicy: mattermost.Spec.ImagePullPolicy,
TerminationMessagePolicy: corev1.TerminationMessageFallbackToLogsOnError,
Command: []string{"mattermost"},
Env: envVars,
Ports: containerPorts,
ReadinessProbe: readiness,
LivenessProbe: liveness,
VolumeMounts: volumeMounts,
Resources: mattermost.Spec.Scheduling.Resources,
SecurityContext: containerSecurityContext,
},
},
ImagePullSecrets: mattermost.Spec.ImagePullSecrets,
Volumes: volumes,
DNSConfig: mattermost.Spec.DNSConfig,
DNSPolicy: mattermost.Spec.DNSPolicy,
Affinity: mattermost.Spec.Scheduling.Affinity,
NodeSelector: mattermost.Spec.Scheduling.NodeSelector,
Tolerations: mattermost.Spec.Scheduling.Tolerations,
SecurityContext: podSecurityContext,
Containers: containers,
ImagePullSecrets: mattermost.Spec.ImagePullSecrets,
Volumes: volumes,
DNSConfig: mattermost.Spec.DNSConfig,
DNSPolicy: mattermost.Spec.DNSPolicy,
Affinity: mattermost.Spec.Scheduling.Affinity,
NodeSelector: mattermost.Spec.Scheduling.NodeSelector,
Tolerations: mattermost.Spec.Scheduling.Tolerations,
SecurityContext: podSecurityContext,
},
},
},
Expand Down
45 changes: 44 additions & 1 deletion pkg/mattermost/mattermost_v1beta_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,6 @@ func TestGenerateDeployment_V1Beta(t *testing.T) {
description string
mmSpec mmv1beta.MattermostSpec
dbConfig DatabaseConfig
fileStoreConfig FileStoreConfig
expectedInitContainers []corev1.Container
}{
{
Expand Down Expand Up @@ -887,6 +886,50 @@ func TestGenerateDeployment_V1Beta(t *testing.T) {
}
})

t.Run("custom sidecar container pod extension", func(t *testing.T) {
dbConfig := &ExternalDBConfig{dbType: database.PostgreSQLDatabase, hasDBCheckURL: false}
customSideBarContainers := []corev1.Container{
{Image: "my-log-exporter-image", Name: "log-exporter"},
{Image: "my-audit-image", Name: "audit"},
}

for _, testCase := range []struct {
description string
mmSpec mmv1beta.MattermostSpec
expectedSidecarContainers []corev1.Container
}{
{
description: "no custom sidebar containers",
mmSpec: mmv1beta.MattermostSpec{
PodExtensions: mmv1beta.PodExtensions{
SidecarContainers: nil,
},
},
expectedSidecarContainers: nil,
},
{
description: "custom sidebar containers",
mmSpec: mmv1beta.MattermostSpec{
PodExtensions: mmv1beta.PodExtensions{
SidecarContainers: customSideBarContainers,
},
},
expectedSidecarContainers: customSideBarContainers,
},
} {
t.Run(testCase.description, func(t *testing.T) {
mattermost := &mmv1beta.Mattermost{
Spec: testCase.mmSpec,
}
deployment := GenerateDeploymentV1Beta(mattermost, dbConfig, &ExternalFileStore{}, "", "", "", "image")
require.Equal(t, len(testCase.expectedSidecarContainers), len(deployment.Spec.Template.Spec.Containers)-1)
if testCase.mmSpec.PodExtensions.SidecarContainers != nil {
assert.Equal(t, testCase.expectedSidecarContainers, deployment.Spec.Template.Spec.Containers[1:])
}
})
}
})

t.Run("should set SiteURL env if ingress host provided", func(t *testing.T) {
mattermost := &mmv1beta.Mattermost{
Spec: mmv1beta.MattermostSpec{},
Expand Down

0 comments on commit ce3fbb3

Please sign in to comment.