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 <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2023-08-28 12:09:06 +02:00
parent bd9f60b70d
commit ced6336804
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
4 changed files with 16 additions and 9 deletions

View File

@ -714,6 +714,10 @@ func TestParseRestartPolicy(t *testing.T) {
Name: container.RestartPolicyDisabled, Name: container.RestartPolicyDisabled,
}, },
}, },
{
input: "no:1",
expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'",
},
{ {
input: ":1", input: ":1",
expectedErr: "invalid restart policy format: no policy provided before colon", expectedErr: "invalid restart policy format: no policy provided before colon",
@ -725,11 +729,8 @@ func TestParseRestartPolicy(t *testing.T) {
}, },
}, },
{ {
input: "always:1", input: "always:1",
expected: container.RestartPolicy{ expectedErr: "invalid restart policy: maximum retry count can only be used with 'on-failure'",
Name: container.RestartPolicyAlways,
MaximumRetryCount: 1,
},
}, },
{ {
input: "always:2:3", input: "always:2:3",
@ -752,6 +753,10 @@ func TestParseRestartPolicy(t *testing.T) {
Name: container.RestartPolicyUnlessStopped, 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", input: "unless-stopped:invalid",
expectedErr: "invalid restart policy format: maximum retry count must be an integer", expectedErr: "invalid restart policy format: maximum retry count must be an integer",

View File

@ -83,8 +83,7 @@ func Service(
return swarm.ServiceSpec{}, err return swarm.ServiceSpec{}, err
} }
restartPolicy, err := convertRestartPolicy( restartPolicy, err := convertRestartPolicy(service.Restart, service.Deploy.RestartPolicy)
service.Restart, service.Deploy.RestartPolicy)
if err != nil { if err != nil {
return swarm.ServiceSpec{}, err return swarm.ServiceSpec{}, err
} }
@ -490,7 +489,7 @@ func convertRestartPolicy(restart string, source *composetypes.RestartPolicy) (*
MaxAttempts: &attempts, MaxAttempts: &attempts,
}, nil }, nil
default: default:
return nil, errors.Errorf("unknown restart policy: %s", restart) return nil, errors.Errorf("invalid restart policy: unknown policy '%s'", restart)
} }
} }

View File

@ -25,7 +25,7 @@ func TestConvertRestartPolicyFromNone(t *testing.T) {
func TestConvertRestartPolicyFromUnknown(t *testing.T) { func TestConvertRestartPolicyFromUnknown(t *testing.T) {
_, err := convertRestartPolicy("unknown", nil) _, 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) { func TestConvertRestartPolicyFromAlways(t *testing.T) {

View File

@ -92,5 +92,8 @@ func ParseRestartPolicy(policy string) (container.RestartPolicy, error) {
} }
p.Name = container.RestartPolicyMode(k) p.Name = container.RestartPolicyMode(k)
if err := container.ValidateRestartPolicy(p); err != nil {
return container.RestartPolicy{}, err
}
return p, nil return p, nil
} }