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
1 change: 1 addition & 0 deletions cmd/cloud/installation.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ func executeInstallationCreateCmd(ctx context.Context, flags installationCreateF
Annotations: flags.annotations,
GroupSelectionAnnotations: flags.groupSelectionAnnotations,
ScheduledDeletionTime: scheduledDeletionTime,
PodProbeOverrides: flags.generateProbeOverrides(),
}

// For CLI to be backward compatible, if only one DNS is passed we use
Expand Down
208 changes: 208 additions & 0 deletions cmd/cloud/installation_flag.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/mattermost/mattermost-cloud/model"
"github.com/pkg/errors"
"github.com/spf13/cobra"
corev1 "k8s.io/api/core/v1"
)

type installationCreateRequestOptions struct {
Expand All @@ -28,6 +29,19 @@ type installationCreateRequestOptions struct {
annotations []string
groupSelectionAnnotations []string
scheduledDeletionTime time.Duration

// Probe override settings
probeLivenessFailureThreshold int32
probeLivenessSuccessThreshold int32
probeLivenessInitialDelaySeconds int32
probeLivenessPeriodSeconds int32
probeLivenessTimeoutSeconds int32

probeReadinessFailureThreshold int32
probeReadinessSuccessThreshold int32
probeReadinessInitialDelaySeconds int32
probeReadinessPeriodSeconds int32
probeReadinessTimeoutSeconds int32
}

func (flags *installationCreateRequestOptions) addFlags(command *cobra.Command) {
Expand All @@ -47,6 +61,19 @@ func (flags *installationCreateRequestOptions) addFlags(command *cobra.Command)
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'")
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.")

// Probe override flags
command.Flags().Int32Var(&flags.probeLivenessFailureThreshold, "probe-liveness-failure-threshold", 0, "Override for the liveness probe failure threshold. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeLivenessSuccessThreshold, "probe-liveness-success-threshold", 0, "Override for the liveness probe success threshold. Use 0 to use server/operator defaults.")
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.")
command.Flags().Int32Var(&flags.probeLivenessPeriodSeconds, "probe-liveness-period-seconds", 0, "Override for the liveness probe period seconds. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeLivenessTimeoutSeconds, "probe-liveness-timeout-seconds", 0, "Override for the liveness probe timeout seconds. Use 0 to use server/operator defaults.")

command.Flags().Int32Var(&flags.probeReadinessFailureThreshold, "probe-readiness-failure-threshold", 0, "Override for the readiness probe failure threshold. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeReadinessSuccessThreshold, "probe-readiness-success-threshold", 0, "Override for the readiness probe success threshold. Use 0 to use server/operator defaults.")
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.")
command.Flags().Int32Var(&flags.probeReadinessPeriodSeconds, "probe-readiness-period-seconds", 0, "Override for the readiness probe period seconds. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeReadinessTimeoutSeconds, "probe-readiness-timeout-seconds", 0, "Override for the readiness probe timeout seconds. Use 0 to use server/operator defaults.")

_ = command.MarkFlagRequired("owner")
}

Expand Down Expand Up @@ -88,6 +115,19 @@ type installationPatchRequestChanges struct {
licenseChanged bool
allowedIPRangesChanged bool
overrideIPRangesChanged bool

// Probe override change flags
probeLivenessFailureThresholdChanged bool
probeLivenessSuccessThresholdChanged bool
probeLivenessInitialDelaySecondsChanged bool
probeLivenessPeriodSecondsChanged bool
probeLivenessTimeoutSecondsChanged bool

probeReadinessFailureThresholdChanged bool
probeReadinessSuccessThresholdChanged bool
probeReadinessInitialDelaySecondsChanged bool
probeReadinessPeriodSecondsChanged bool
probeReadinessTimeoutSecondsChanged bool
}

func (flags *installationPatchRequestChanges) addFlags(command *cobra.Command) {
Expand All @@ -98,6 +138,19 @@ func (flags *installationPatchRequestChanges) addFlags(command *cobra.Command) {
flags.licenseChanged = command.Flags().Changed("license")
flags.allowedIPRangesChanged = command.Flags().Changed("allowed-ip-ranges")
flags.overrideIPRangesChanged = command.Flags().Changed("override-ip-ranges")

// Probe override change flags
flags.probeLivenessFailureThresholdChanged = command.Flags().Changed("probe-liveness-failure-threshold")
flags.probeLivenessSuccessThresholdChanged = command.Flags().Changed("probe-liveness-success-threshold")
flags.probeLivenessInitialDelaySecondsChanged = command.Flags().Changed("probe-liveness-initial-delay-seconds")
flags.probeLivenessPeriodSecondsChanged = command.Flags().Changed("probe-liveness-period-seconds")
flags.probeLivenessTimeoutSecondsChanged = command.Flags().Changed("probe-liveness-timeout-seconds")

flags.probeReadinessFailureThresholdChanged = command.Flags().Changed("probe-readiness-failure-threshold")
flags.probeReadinessSuccessThresholdChanged = command.Flags().Changed("probe-readiness-success-threshold")
flags.probeReadinessInitialDelaySecondsChanged = command.Flags().Changed("probe-readiness-initial-delay-seconds")
flags.probeReadinessPeriodSecondsChanged = command.Flags().Changed("probe-readiness-period-seconds")
flags.probeReadinessTimeoutSecondsChanged = command.Flags().Changed("probe-readiness-timeout-seconds")
}

type installationPatchRequestOptions struct {
Expand All @@ -111,6 +164,19 @@ type installationPatchRequestOptions struct {
mattermostEnv []string
mattermostEnvClear bool
overrideIPRanges bool

// Probe override settings
probeLivenessFailureThreshold int32
probeLivenessSuccessThreshold int32
probeLivenessInitialDelaySeconds int32
probeLivenessPeriodSeconds int32
probeLivenessTimeoutSeconds int32

probeReadinessFailureThreshold int32
probeReadinessSuccessThreshold int32
probeReadinessInitialDelaySeconds int32
probeReadinessPeriodSeconds int32
probeReadinessTimeoutSeconds int32
}

func (flags *installationPatchRequestOptions) addFlags(command *cobra.Command) {
Expand All @@ -123,6 +189,19 @@ func (flags *installationPatchRequestOptions) addFlags(command *cobra.Command) {
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.")
command.Flags().BoolVar(&flags.mattermostEnvClear, "mattermost-env-clear", false, "Clears all env var data.")
command.Flags().BoolVar(&flags.overrideIPRanges, "override-ip-ranges", true, "Overrides Allowed IP ranges and force ignoring any previous value.")

// Probe override flags
command.Flags().Int32Var(&flags.probeLivenessFailureThreshold, "probe-liveness-failure-threshold", 0, "Override for the liveness probe failure threshold. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeLivenessSuccessThreshold, "probe-liveness-success-threshold", 0, "Override for the liveness probe success threshold. Use 0 to use server/operator defaults.")
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.")
command.Flags().Int32Var(&flags.probeLivenessPeriodSeconds, "probe-liveness-period-seconds", 0, "Override for the liveness probe period seconds. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeLivenessTimeoutSeconds, "probe-liveness-timeout-seconds", 0, "Override for the liveness probe timeout seconds. Use 0 to use server/operator defaults.")

command.Flags().Int32Var(&flags.probeReadinessFailureThreshold, "probe-readiness-failure-threshold", 0, "Override for the readiness probe failure threshold. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeReadinessSuccessThreshold, "probe-readiness-success-threshold", 0, "Override for the readiness probe success threshold. Use 0 to use server/operator defaults.")
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.")
command.Flags().Int32Var(&flags.probeReadinessPeriodSeconds, "probe-readiness-period-seconds", 0, "Override for the readiness probe period seconds. Use 0 to use server/operator defaults.")
command.Flags().Int32Var(&flags.probeReadinessTimeoutSeconds, "probe-readiness-timeout-seconds", 0, "Override for the readiness probe timeout seconds. Use 0 to use server/operator defaults.")
}

func (flags *installationPatchRequestOptions) GetPatchInstallationRequest() *model.PatchInstallationRequest {
Expand Down Expand Up @@ -152,9 +231,138 @@ func (flags *installationPatchRequestOptions) GetPatchInstallationRequest() *mod
request.OverrideIPRanges = &flags.overrideIPRanges
}

// Add probe overrides if any probe flags were changed
request.PodProbeOverrides = flags.generateProbeOverrides()

return &request
}

// generateProbeOverrides creates PodProbeOverrides from the installation flags
func (flags *installationPatchRequestOptions) generateProbeOverrides() *model.PodProbeOverrides {
var probeOverrides *model.PodProbeOverrides

livenessOverride := &corev1.Probe{}
var livenessChanged bool
if flags.probeLivenessFailureThresholdChanged {
livenessOverride.FailureThreshold = flags.probeLivenessFailureThreshold
livenessChanged = true
}
if flags.probeLivenessSuccessThresholdChanged {
livenessOverride.SuccessThreshold = flags.probeLivenessSuccessThreshold
livenessChanged = true
}
if flags.probeLivenessInitialDelaySecondsChanged {
livenessOverride.InitialDelaySeconds = flags.probeLivenessInitialDelaySeconds
livenessChanged = true
}
if flags.probeLivenessPeriodSecondsChanged {
livenessOverride.PeriodSeconds = flags.probeLivenessPeriodSeconds
livenessChanged = true
}
if flags.probeLivenessTimeoutSecondsChanged {
livenessOverride.TimeoutSeconds = flags.probeLivenessTimeoutSeconds
livenessChanged = true
}

readinessOverride := &corev1.Probe{}
var readinessChanged bool
if flags.probeReadinessFailureThresholdChanged {
readinessOverride.FailureThreshold = flags.probeReadinessFailureThreshold
readinessChanged = true
}
if flags.probeReadinessSuccessThresholdChanged {
readinessOverride.SuccessThreshold = flags.probeReadinessSuccessThreshold
readinessChanged = true
}
if flags.probeReadinessInitialDelaySecondsChanged {
readinessOverride.InitialDelaySeconds = flags.probeReadinessInitialDelaySeconds
readinessChanged = true
}
if flags.probeReadinessPeriodSecondsChanged {
readinessOverride.PeriodSeconds = flags.probeReadinessPeriodSeconds
readinessChanged = true
}
if flags.probeReadinessTimeoutSecondsChanged {
readinessOverride.TimeoutSeconds = flags.probeReadinessTimeoutSeconds
readinessChanged = true
}

if livenessChanged || readinessChanged {
probeOverrides = &model.PodProbeOverrides{}
if livenessChanged {
probeOverrides.LivenessProbeOverride = livenessOverride
}
if readinessChanged {
probeOverrides.ReadinessProbeOverride = readinessOverride
}
}

return probeOverrides
}

// generateProbeOverridesForCreate creates PodProbeOverrides from the installation create flags
func (flags *installationCreateRequestOptions) generateProbeOverrides() *model.PodProbeOverrides {
var probeOverrides *model.PodProbeOverrides

livenessOverride := &corev1.Probe{}
var livenessChanged bool
if flags.probeLivenessFailureThreshold > 0 {
livenessOverride.FailureThreshold = flags.probeLivenessFailureThreshold
livenessChanged = true
}
if flags.probeLivenessSuccessThreshold > 0 {
livenessOverride.SuccessThreshold = flags.probeLivenessSuccessThreshold
livenessChanged = true
}
if flags.probeLivenessInitialDelaySeconds > 0 {
livenessOverride.InitialDelaySeconds = flags.probeLivenessInitialDelaySeconds
livenessChanged = true
}
if flags.probeLivenessPeriodSeconds > 0 {
livenessOverride.PeriodSeconds = flags.probeLivenessPeriodSeconds
livenessChanged = true
}
if flags.probeLivenessTimeoutSeconds > 0 {
livenessOverride.TimeoutSeconds = flags.probeLivenessTimeoutSeconds
livenessChanged = true
}

readinessOverride := &corev1.Probe{}
var readinessChanged bool
if flags.probeReadinessFailureThreshold > 0 {
readinessOverride.FailureThreshold = flags.probeReadinessFailureThreshold
readinessChanged = true
}
if flags.probeReadinessSuccessThreshold > 0 {
readinessOverride.SuccessThreshold = flags.probeReadinessSuccessThreshold
readinessChanged = true
}
if flags.probeReadinessInitialDelaySeconds > 0 {
readinessOverride.InitialDelaySeconds = flags.probeReadinessInitialDelaySeconds
readinessChanged = true
}
if flags.probeReadinessPeriodSeconds > 0 {
readinessOverride.PeriodSeconds = flags.probeReadinessPeriodSeconds
readinessChanged = true
}
if flags.probeReadinessTimeoutSeconds > 0 {
readinessOverride.TimeoutSeconds = flags.probeReadinessTimeoutSeconds
readinessChanged = true
}

if livenessChanged || readinessChanged {
probeOverrides = &model.PodProbeOverrides{}
if livenessChanged {
probeOverrides.LivenessProbeOverride = livenessOverride
}
if readinessChanged {
probeOverrides.ReadinessProbeOverride = readinessOverride
}
}

return probeOverrides
}

type installationUpdateFlags struct {
clusterFlags
installationPatchRequestOptions
Expand Down
6 changes: 3 additions & 3 deletions cmd/cloud/server_flag.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ package main
import (
"time"

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

func (flags *serverFlags) generateProbeOverrides() provisioner.PodProbeOverrides {
probeOverrides := provisioner.PodProbeOverrides{}
func (flags *serverFlags) generateProbeOverrides() model.PodProbeOverrides {
probeOverrides := model.PodProbeOverrides{}

livenessOverride := corev1.Probe{}
var livenessChanged bool
Expand Down
4 changes: 2 additions & 2 deletions cmd/cloud/server_flag_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ package main
import (
"testing"

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

expected := provisioner.PodProbeOverrides{}
expected := model.PodProbeOverrides{}
assert.Equal(t, expected, result)
assert.Nil(t, result.LivenessProbeOverride)
assert.Nil(t, result.ReadinessProbeOverride)
Expand Down
1 change: 1 addition & 0 deletions internal/api/installation.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ func handleCreateInstallation(c *Context, w http.ResponseWriter, r *http.Request
ScheduledDeletionTime: createInstallationRequest.ScheduledDeletionTime,
SingleTenantDatabaseConfig: createInstallationRequest.SingleTenantDatabaseConfig.ToDBConfig(createInstallationRequest.Database),
ExternalDatabaseConfig: createInstallationRequest.ExternalDatabaseConfig.ToDBConfig(createInstallationRequest.Database),
PodProbeOverrides: createInstallationRequest.PodProbeOverrides,
CRVersion: model.DefaultCRVersion,
State: model.InstallationStateCreationRequested,
}
Expand Down
Loading
Loading