From ced6336804898516294a9c6d090d68037bb40fb4 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 28 Aug 2023 12:09:06 +0200 Subject: [PATCH] opts: ParseRestartPolicy: improve validation of max restart-counts Use the new container.ValidateRestartPolicy utility to verify if a max-restart-count is allowed for the given restart-policy. Signed-off-by: Sebastiaan van Stijn --- cli/command/container/opts_test.go | 15 ++++++++++----- cli/compose/convert/service.go | 5 ++--- cli/compose/convert/service_test.go | 2 +- opts/parse.go | 3 +++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/cli/command/container/opts_test.go b/cli/command/container/opts_test.go index 1cd68046b6..d4d42de206 100644 --- a/cli/command/container/opts_test.go +++ b/cli/command/container/opts_test.go @@ -714,6 +714,10 @@ func TestParseRestartPolicy(t *testing.T) { Name: container.RestartPolicyDisabled, }, }, + { + input: "no:1", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", + }, { input: ":1", expectedErr: "invalid restart policy format: no policy provided before colon", @@ -725,11 +729,8 @@ func TestParseRestartPolicy(t *testing.T) { }, }, { - input: "always:1", - expected: container.RestartPolicy{ - Name: container.RestartPolicyAlways, - MaximumRetryCount: 1, - }, + input: "always:1", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", }, { input: "always:2:3", @@ -752,6 +753,10 @@ func TestParseRestartPolicy(t *testing.T) { Name: container.RestartPolicyUnlessStopped, }, }, + { + input: "unless-stopped:1", + expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'", + }, { input: "unless-stopped:invalid", expectedErr: "invalid restart policy format: maximum retry count must be an integer", diff --git a/cli/compose/convert/service.go b/cli/compose/convert/service.go index bb9255d581..5be2a1c608 100644 --- a/cli/compose/convert/service.go +++ b/cli/compose/convert/service.go @@ -83,8 +83,7 @@ func Service( return swarm.ServiceSpec{}, err } - restartPolicy, err := convertRestartPolicy( - service.Restart, service.Deploy.RestartPolicy) + restartPolicy, err := convertRestartPolicy(service.Restart, service.Deploy.RestartPolicy) if err != nil { return swarm.ServiceSpec{}, err } @@ -490,7 +489,7 @@ func convertRestartPolicy(restart string, source *composetypes.RestartPolicy) (* MaxAttempts: &attempts, }, nil default: - return nil, errors.Errorf("unknown restart policy: %s", restart) + return nil, errors.Errorf("invalid restart policy: unknown policy '%s'", restart) } } diff --git a/cli/compose/convert/service_test.go b/cli/compose/convert/service_test.go index 4d48acc3ea..c561671490 100644 --- a/cli/compose/convert/service_test.go +++ b/cli/compose/convert/service_test.go @@ -25,7 +25,7 @@ func TestConvertRestartPolicyFromNone(t *testing.T) { func TestConvertRestartPolicyFromUnknown(t *testing.T) { _, err := convertRestartPolicy("unknown", nil) - assert.Error(t, err, "unknown restart policy: unknown") + assert.Error(t, err, "invalid restart policy: unknown policy 'unknown'; use one of 'no', 'always', 'on-failure', or 'unless-stopped'") } func TestConvertRestartPolicyFromAlways(t *testing.T) { diff --git a/opts/parse.go b/opts/parse.go index 381648fe73..97cef57e9d 100644 --- a/opts/parse.go +++ b/opts/parse.go @@ -92,5 +92,8 @@ func ParseRestartPolicy(policy string) (container.RestartPolicy, error) { } p.Name = container.RestartPolicyMode(k) + if err := container.ValidateRestartPolicy(p); err != nil { + return container.RestartPolicy{}, err + } return p, nil }