Skip to content
Open
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
19 changes: 15 additions & 4 deletions CubeMaster/cmd/cubemastercli/commands/cubebox/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -766,8 +766,9 @@ var TemplateCreateFromImageCommand = cli.Command{
cli.StringSliceFlag{Name: "arg", Usage: "override container CMD (args); repeat for multiple elements"},
cli.StringSliceFlag{Name: "env", Usage: "set environment variable, KEY=VALUE format; repeat for multiple envs"},
cli.StringSliceFlag{Name: "dns", Usage: "set container DNS nameserver; repeat for multiple servers"},
cli.IntFlag{Name: "probe", Usage: "enable HTTP GET probe on the specified port (e.g. --probe 9000); sets timeout_ms=30000, period_ms=500"},
cli.IntFlag{Name: "probe", Usage: "enable HTTP GET probe on the specified port (e.g. --probe 9000); see --probe-timeout, --probe-path"},
cli.StringFlag{Name: "probe-path", Value: "/health", Usage: "HTTP path for the readiness probe (default: /health); only effective when --probe is set"},
cli.DurationFlag{Name: "probe-timeout", Value: 120 * time.Second, Usage: "total probe wall-clock budget (e.g. 30s, 2m); only effective when --probe is set; default 120s suits nested-KVM hosts where the in-guest application takes longer than 30s to bind the probe port"},
cli.IntFlag{Name: "cpu", Value: 2000, Usage: "CPU millicores for the template container (default: 2000, i.e. 2 cores)"},
cli.IntFlag{Name: "memory", Value: 2000, Usage: "Memory for the template container in MB (default: 2000 MB)"},
cli.BoolFlag{Name: "json", Usage: "print raw json response"},
Expand Down Expand Up @@ -1315,6 +1316,16 @@ func parseContainerOverrides(c *cli.Context) (*types.ContainerOverrides, error)
if probePath == "" {
probePath = "/health"
}
probeTimeout := c.Duration("probe-timeout")
if probeTimeout < time.Second {
return nil, fmt.Errorf("--probe-timeout must be at least 1s, got %s", probeTimeout)
}
// PeriodMs is fixed at 1s; FailureThreshold derives from the requested
// total budget (rounded up to whole seconds). TimeoutMs == total budget
// so it never trips before FailureThreshold does.
periodMs := int32(1000)
timeoutMs := int32(probeTimeout.Milliseconds())
failureThreshold := int32((probeTimeout + time.Second - 1) / time.Second)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use Milliseconds() method.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You've checked probeTimeout above, so you can just do:

failureThreshold := int32(probeTimeout / time.Second)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ishswar Could you please address the suggestions and update the PR?

host := ""
overrides.Probe = &types.Probe{
ProbeHandler: &types.ProbeHandler{
Expand All @@ -1324,9 +1335,9 @@ func parseContainerOverrides(c *cli.Context) (*types.ContainerOverrides, error)
Host: &host,
},
},
TimeoutMs: 30000,
PeriodMs: 500,
FailureThreshold: 60,
TimeoutMs: timeoutMs,
PeriodMs: periodMs,
FailureThreshold: failureThreshold,
SuccessThreshold: 1,
}
}
Expand Down