Skip to content

Commit 45094df

Browse files
nickmisasiclaude[bot]claude
authored
Add probe overrides to installation level (#1115)
* Add pod probe overrides to installation level * Undo rogue cursor change * PodProbeOverrides * Fix linter * Remove line of code * update with JSON marshaling * Support for merging installation overrides into server overrides rather than fully overwriting them * Fix postgres test failures for PodProbeOverrides - Remove manual JSON marshaling/unmarshaling for PodProbeOverrides - Use direct struct mapping like PgBouncerConfig pattern - Update SQL query to select column directly without alias - Remove PodProbeOverridesRaw field from rawInstallation struct - Update createInstallation and updateInstallation methods This aligns with how other JSON columns are handled and fixes the postgres test CI pipeline failures. Co-authored-by: nickmisasi <nickmisasi@users.noreply.github.com> 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent a1cd920 commit 45094df

12 files changed

+735
-43
lines changed

cmd/cloud/installation.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ func executeInstallationCreateCmd(ctx context.Context, flags installationCreateF
107107
Annotations: flags.annotations,
108108
GroupSelectionAnnotations: flags.groupSelectionAnnotations,
109109
ScheduledDeletionTime: scheduledDeletionTime,
110+
PodProbeOverrides: flags.generateProbeOverrides(),
110111
}
111112

112113
// For CLI to be backward compatible, if only one DNS is passed we use

cmd/cloud/installation_flag.go

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/mattermost/mattermost-cloud/model"
1111
"github.com/pkg/errors"
1212
"github.com/spf13/cobra"
13+
corev1 "k8s.io/api/core/v1"
1314
)
1415

1516
type installationCreateRequestOptions struct {
@@ -28,6 +29,19 @@ type installationCreateRequestOptions struct {
2829
annotations []string
2930
groupSelectionAnnotations []string
3031
scheduledDeletionTime time.Duration
32+
33+
// Probe override settings
34+
probeLivenessFailureThreshold int32
35+
probeLivenessSuccessThreshold int32
36+
probeLivenessInitialDelaySeconds int32
37+
probeLivenessPeriodSeconds int32
38+
probeLivenessTimeoutSeconds int32
39+
40+
probeReadinessFailureThreshold int32
41+
probeReadinessSuccessThreshold int32
42+
probeReadinessInitialDelaySeconds int32
43+
probeReadinessPeriodSeconds int32
44+
probeReadinessTimeoutSeconds int32
3145
}
3246

3347
func (flags *installationCreateRequestOptions) addFlags(command *cobra.Command) {
@@ -47,6 +61,19 @@ func (flags *installationCreateRequestOptions) addFlags(command *cobra.Command)
4761
command.Flags().StringArrayVar(&flags.groupSelectionAnnotations, "group-selection-annotation", []string{}, "Annotations for automatic group selection. Accepts multiple values, for example: '... --group-selection-annotation abc --group-selection-annotation def'")
4862
command.Flags().DurationVar(&flags.scheduledDeletionTime, "scheduled-deletion-time", 0, "The time from now when the installation should be deleted. Use 0 for no scheduled deletion.")
4963

64+
// Probe override flags
65+
command.Flags().Int32Var(&flags.probeLivenessFailureThreshold, "probe-liveness-failure-threshold", 0, "Override for the liveness probe failure threshold. Use 0 to use server/operator defaults.")
66+
command.Flags().Int32Var(&flags.probeLivenessSuccessThreshold, "probe-liveness-success-threshold", 0, "Override for the liveness probe success threshold. Use 0 to use server/operator defaults.")
67+
command.Flags().Int32Var(&flags.probeLivenessInitialDelaySeconds, "probe-liveness-initial-delay-seconds", 0, "Override for the liveness probe initial delay seconds. Use 0 to use server/operator defaults.")
68+
command.Flags().Int32Var(&flags.probeLivenessPeriodSeconds, "probe-liveness-period-seconds", 0, "Override for the liveness probe period seconds. Use 0 to use server/operator defaults.")
69+
command.Flags().Int32Var(&flags.probeLivenessTimeoutSeconds, "probe-liveness-timeout-seconds", 0, "Override for the liveness probe timeout seconds. Use 0 to use server/operator defaults.")
70+
71+
command.Flags().Int32Var(&flags.probeReadinessFailureThreshold, "probe-readiness-failure-threshold", 0, "Override for the readiness probe failure threshold. Use 0 to use server/operator defaults.")
72+
command.Flags().Int32Var(&flags.probeReadinessSuccessThreshold, "probe-readiness-success-threshold", 0, "Override for the readiness probe success threshold. Use 0 to use server/operator defaults.")
73+
command.Flags().Int32Var(&flags.probeReadinessInitialDelaySeconds, "probe-readiness-initial-delay-seconds", 0, "Override for the readiness probe initial delay seconds. Use 0 to use server/operator defaults.")
74+
command.Flags().Int32Var(&flags.probeReadinessPeriodSeconds, "probe-readiness-period-seconds", 0, "Override for the readiness probe period seconds. Use 0 to use server/operator defaults.")
75+
command.Flags().Int32Var(&flags.probeReadinessTimeoutSeconds, "probe-readiness-timeout-seconds", 0, "Override for the readiness probe timeout seconds. Use 0 to use server/operator defaults.")
76+
5077
_ = command.MarkFlagRequired("owner")
5178
}
5279

@@ -88,6 +115,19 @@ type installationPatchRequestChanges struct {
88115
licenseChanged bool
89116
allowedIPRangesChanged bool
90117
overrideIPRangesChanged bool
118+
119+
// Probe override change flags
120+
probeLivenessFailureThresholdChanged bool
121+
probeLivenessSuccessThresholdChanged bool
122+
probeLivenessInitialDelaySecondsChanged bool
123+
probeLivenessPeriodSecondsChanged bool
124+
probeLivenessTimeoutSecondsChanged bool
125+
126+
probeReadinessFailureThresholdChanged bool
127+
probeReadinessSuccessThresholdChanged bool
128+
probeReadinessInitialDelaySecondsChanged bool
129+
probeReadinessPeriodSecondsChanged bool
130+
probeReadinessTimeoutSecondsChanged bool
91131
}
92132

93133
func (flags *installationPatchRequestChanges) addFlags(command *cobra.Command) {
@@ -98,6 +138,19 @@ func (flags *installationPatchRequestChanges) addFlags(command *cobra.Command) {
98138
flags.licenseChanged = command.Flags().Changed("license")
99139
flags.allowedIPRangesChanged = command.Flags().Changed("allowed-ip-ranges")
100140
flags.overrideIPRangesChanged = command.Flags().Changed("override-ip-ranges")
141+
142+
// Probe override change flags
143+
flags.probeLivenessFailureThresholdChanged = command.Flags().Changed("probe-liveness-failure-threshold")
144+
flags.probeLivenessSuccessThresholdChanged = command.Flags().Changed("probe-liveness-success-threshold")
145+
flags.probeLivenessInitialDelaySecondsChanged = command.Flags().Changed("probe-liveness-initial-delay-seconds")
146+
flags.probeLivenessPeriodSecondsChanged = command.Flags().Changed("probe-liveness-period-seconds")
147+
flags.probeLivenessTimeoutSecondsChanged = command.Flags().Changed("probe-liveness-timeout-seconds")
148+
149+
flags.probeReadinessFailureThresholdChanged = command.Flags().Changed("probe-readiness-failure-threshold")
150+
flags.probeReadinessSuccessThresholdChanged = command.Flags().Changed("probe-readiness-success-threshold")
151+
flags.probeReadinessInitialDelaySecondsChanged = command.Flags().Changed("probe-readiness-initial-delay-seconds")
152+
flags.probeReadinessPeriodSecondsChanged = command.Flags().Changed("probe-readiness-period-seconds")
153+
flags.probeReadinessTimeoutSecondsChanged = command.Flags().Changed("probe-readiness-timeout-seconds")
101154
}
102155

103156
type installationPatchRequestOptions struct {
@@ -111,6 +164,19 @@ type installationPatchRequestOptions struct {
111164
mattermostEnv []string
112165
mattermostEnvClear bool
113166
overrideIPRanges bool
167+
168+
// Probe override settings
169+
probeLivenessFailureThreshold int32
170+
probeLivenessSuccessThreshold int32
171+
probeLivenessInitialDelaySeconds int32
172+
probeLivenessPeriodSeconds int32
173+
probeLivenessTimeoutSeconds int32
174+
175+
probeReadinessFailureThreshold int32
176+
probeReadinessSuccessThreshold int32
177+
probeReadinessInitialDelaySeconds int32
178+
probeReadinessPeriodSeconds int32
179+
probeReadinessTimeoutSeconds int32
114180
}
115181

116182
func (flags *installationPatchRequestOptions) addFlags(command *cobra.Command) {
@@ -123,6 +189,19 @@ func (flags *installationPatchRequestOptions) addFlags(command *cobra.Command) {
123189
command.Flags().StringArrayVar(&flags.mattermostEnv, "mattermost-env", []string{}, "Env vars to add to the Mattermost App. Accepts format: KEY_NAME=VALUE. Use the flag multiple times to set multiple env vars.")
124190
command.Flags().BoolVar(&flags.mattermostEnvClear, "mattermost-env-clear", false, "Clears all env var data.")
125191
command.Flags().BoolVar(&flags.overrideIPRanges, "override-ip-ranges", true, "Overrides Allowed IP ranges and force ignoring any previous value.")
192+
193+
// Probe override flags
194+
command.Flags().Int32Var(&flags.probeLivenessFailureThreshold, "probe-liveness-failure-threshold", 0, "Override for the liveness probe failure threshold. Use 0 to use server/operator defaults.")
195+
command.Flags().Int32Var(&flags.probeLivenessSuccessThreshold, "probe-liveness-success-threshold", 0, "Override for the liveness probe success threshold. Use 0 to use server/operator defaults.")
196+
command.Flags().Int32Var(&flags.probeLivenessInitialDelaySeconds, "probe-liveness-initial-delay-seconds", 0, "Override for the liveness probe initial delay seconds. Use 0 to use server/operator defaults.")
197+
command.Flags().Int32Var(&flags.probeLivenessPeriodSeconds, "probe-liveness-period-seconds", 0, "Override for the liveness probe period seconds. Use 0 to use server/operator defaults.")
198+
command.Flags().Int32Var(&flags.probeLivenessTimeoutSeconds, "probe-liveness-timeout-seconds", 0, "Override for the liveness probe timeout seconds. Use 0 to use server/operator defaults.")
199+
200+
command.Flags().Int32Var(&flags.probeReadinessFailureThreshold, "probe-readiness-failure-threshold", 0, "Override for the readiness probe failure threshold. Use 0 to use server/operator defaults.")
201+
command.Flags().Int32Var(&flags.probeReadinessSuccessThreshold, "probe-readiness-success-threshold", 0, "Override for the readiness probe success threshold. Use 0 to use server/operator defaults.")
202+
command.Flags().Int32Var(&flags.probeReadinessInitialDelaySeconds, "probe-readiness-initial-delay-seconds", 0, "Override for the readiness probe initial delay seconds. Use 0 to use server/operator defaults.")
203+
command.Flags().Int32Var(&flags.probeReadinessPeriodSeconds, "probe-readiness-period-seconds", 0, "Override for the readiness probe period seconds. Use 0 to use server/operator defaults.")
204+
command.Flags().Int32Var(&flags.probeReadinessTimeoutSeconds, "probe-readiness-timeout-seconds", 0, "Override for the readiness probe timeout seconds. Use 0 to use server/operator defaults.")
126205
}
127206

128207
func (flags *installationPatchRequestOptions) GetPatchInstallationRequest() *model.PatchInstallationRequest {
@@ -152,9 +231,138 @@ func (flags *installationPatchRequestOptions) GetPatchInstallationRequest() *mod
152231
request.OverrideIPRanges = &flags.overrideIPRanges
153232
}
154233

234+
// Add probe overrides if any probe flags were changed
235+
request.PodProbeOverrides = flags.generateProbeOverrides()
236+
155237
return &request
156238
}
157239

240+
// generateProbeOverrides creates PodProbeOverrides from the installation flags
241+
func (flags *installationPatchRequestOptions) generateProbeOverrides() *model.PodProbeOverrides {
242+
var probeOverrides *model.PodProbeOverrides
243+
244+
livenessOverride := &corev1.Probe{}
245+
var livenessChanged bool
246+
if flags.probeLivenessFailureThresholdChanged {
247+
livenessOverride.FailureThreshold = flags.probeLivenessFailureThreshold
248+
livenessChanged = true
249+
}
250+
if flags.probeLivenessSuccessThresholdChanged {
251+
livenessOverride.SuccessThreshold = flags.probeLivenessSuccessThreshold
252+
livenessChanged = true
253+
}
254+
if flags.probeLivenessInitialDelaySecondsChanged {
255+
livenessOverride.InitialDelaySeconds = flags.probeLivenessInitialDelaySeconds
256+
livenessChanged = true
257+
}
258+
if flags.probeLivenessPeriodSecondsChanged {
259+
livenessOverride.PeriodSeconds = flags.probeLivenessPeriodSeconds
260+
livenessChanged = true
261+
}
262+
if flags.probeLivenessTimeoutSecondsChanged {
263+
livenessOverride.TimeoutSeconds = flags.probeLivenessTimeoutSeconds
264+
livenessChanged = true
265+
}
266+
267+
readinessOverride := &corev1.Probe{}
268+
var readinessChanged bool
269+
if flags.probeReadinessFailureThresholdChanged {
270+
readinessOverride.FailureThreshold = flags.probeReadinessFailureThreshold
271+
readinessChanged = true
272+
}
273+
if flags.probeReadinessSuccessThresholdChanged {
274+
readinessOverride.SuccessThreshold = flags.probeReadinessSuccessThreshold
275+
readinessChanged = true
276+
}
277+
if flags.probeReadinessInitialDelaySecondsChanged {
278+
readinessOverride.InitialDelaySeconds = flags.probeReadinessInitialDelaySeconds
279+
readinessChanged = true
280+
}
281+
if flags.probeReadinessPeriodSecondsChanged {
282+
readinessOverride.PeriodSeconds = flags.probeReadinessPeriodSeconds
283+
readinessChanged = true
284+
}
285+
if flags.probeReadinessTimeoutSecondsChanged {
286+
readinessOverride.TimeoutSeconds = flags.probeReadinessTimeoutSeconds
287+
readinessChanged = true
288+
}
289+
290+
if livenessChanged || readinessChanged {
291+
probeOverrides = &model.PodProbeOverrides{}
292+
if livenessChanged {
293+
probeOverrides.LivenessProbeOverride = livenessOverride
294+
}
295+
if readinessChanged {
296+
probeOverrides.ReadinessProbeOverride = readinessOverride
297+
}
298+
}
299+
300+
return probeOverrides
301+
}
302+
303+
// generateProbeOverridesForCreate creates PodProbeOverrides from the installation create flags
304+
func (flags *installationCreateRequestOptions) generateProbeOverrides() *model.PodProbeOverrides {
305+
var probeOverrides *model.PodProbeOverrides
306+
307+
livenessOverride := &corev1.Probe{}
308+
var livenessChanged bool
309+
if flags.probeLivenessFailureThreshold > 0 {
310+
livenessOverride.FailureThreshold = flags.probeLivenessFailureThreshold
311+
livenessChanged = true
312+
}
313+
if flags.probeLivenessSuccessThreshold > 0 {
314+
livenessOverride.SuccessThreshold = flags.probeLivenessSuccessThreshold
315+
livenessChanged = true
316+
}
317+
if flags.probeLivenessInitialDelaySeconds > 0 {
318+
livenessOverride.InitialDelaySeconds = flags.probeLivenessInitialDelaySeconds
319+
livenessChanged = true
320+
}
321+
if flags.probeLivenessPeriodSeconds > 0 {
322+
livenessOverride.PeriodSeconds = flags.probeLivenessPeriodSeconds
323+
livenessChanged = true
324+
}
325+
if flags.probeLivenessTimeoutSeconds > 0 {
326+
livenessOverride.TimeoutSeconds = flags.probeLivenessTimeoutSeconds
327+
livenessChanged = true
328+
}
329+
330+
readinessOverride := &corev1.Probe{}
331+
var readinessChanged bool
332+
if flags.probeReadinessFailureThreshold > 0 {
333+
readinessOverride.FailureThreshold = flags.probeReadinessFailureThreshold
334+
readinessChanged = true
335+
}
336+
if flags.probeReadinessSuccessThreshold > 0 {
337+
readinessOverride.SuccessThreshold = flags.probeReadinessSuccessThreshold
338+
readinessChanged = true
339+
}
340+
if flags.probeReadinessInitialDelaySeconds > 0 {
341+
readinessOverride.InitialDelaySeconds = flags.probeReadinessInitialDelaySeconds
342+
readinessChanged = true
343+
}
344+
if flags.probeReadinessPeriodSeconds > 0 {
345+
readinessOverride.PeriodSeconds = flags.probeReadinessPeriodSeconds
346+
readinessChanged = true
347+
}
348+
if flags.probeReadinessTimeoutSeconds > 0 {
349+
readinessOverride.TimeoutSeconds = flags.probeReadinessTimeoutSeconds
350+
readinessChanged = true
351+
}
352+
353+
if livenessChanged || readinessChanged {
354+
probeOverrides = &model.PodProbeOverrides{}
355+
if livenessChanged {
356+
probeOverrides.LivenessProbeOverride = livenessOverride
357+
}
358+
if readinessChanged {
359+
probeOverrides.ReadinessProbeOverride = readinessOverride
360+
}
361+
}
362+
363+
return probeOverrides
364+
}
365+
158366
type installationUpdateFlags struct {
159367
clusterFlags
160368
installationPatchRequestOptions

cmd/cloud/server_flag.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ package main
77
import (
88
"time"
99

10-
"github.com/mattermost/mattermost-cloud/internal/provisioner"
1110
toolsAWS "github.com/mattermost/mattermost-cloud/internal/tools/aws"
11+
"github.com/mattermost/mattermost-cloud/model"
1212
"github.com/spf13/cobra"
1313
corev1 "k8s.io/api/core/v1"
1414
)
@@ -135,8 +135,8 @@ func (flags *provisioningParams) addFlags(command *cobra.Command) {
135135
command.Flags().Int32Var(&flags.probeReadinessTimeoutSeconds, "probe-readiness-timeout-seconds", 5, "An optional override for the readiness probe timeout seconds.")
136136
}
137137

138-
func (flags *serverFlags) generateProbeOverrides() provisioner.PodProbeOverrides {
139-
probeOverrides := provisioner.PodProbeOverrides{}
138+
func (flags *serverFlags) generateProbeOverrides() model.PodProbeOverrides {
139+
probeOverrides := model.PodProbeOverrides{}
140140

141141
livenessOverride := corev1.Probe{}
142142
var livenessChanged bool

cmd/cloud/server_flag_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package main
77
import (
88
"testing"
99

10-
"github.com/mattermost/mattermost-cloud/internal/provisioner"
10+
"github.com/mattermost/mattermost-cloud/model"
1111
"github.com/stretchr/testify/assert"
1212
corev1 "k8s.io/api/core/v1"
1313
)
@@ -17,7 +17,7 @@ func TestGenerateProbeOverrides(t *testing.T) {
1717
flags := &serverFlags{}
1818
result := flags.generateProbeOverrides()
1919

20-
expected := provisioner.PodProbeOverrides{}
20+
expected := model.PodProbeOverrides{}
2121
assert.Equal(t, expected, result)
2222
assert.Nil(t, result.LivenessProbeOverride)
2323
assert.Nil(t, result.ReadinessProbeOverride)

internal/api/installation.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ func handleCreateInstallation(c *Context, w http.ResponseWriter, r *http.Request
243243
ScheduledDeletionTime: createInstallationRequest.ScheduledDeletionTime,
244244
SingleTenantDatabaseConfig: createInstallationRequest.SingleTenantDatabaseConfig.ToDBConfig(createInstallationRequest.Database),
245245
ExternalDatabaseConfig: createInstallationRequest.ExternalDatabaseConfig.ToDBConfig(createInstallationRequest.Database),
246+
PodProbeOverrides: createInstallationRequest.PodProbeOverrides,
246247
CRVersion: model.DefaultCRVersion,
247248
State: model.InstallationStateCreationRequested,
248249
}

0 commit comments

Comments
 (0)