From 8c379e723ed7a3b7b602efb5b1c4e01bd217fd6f Mon Sep 17 00:00:00 2001 From: Sayan- <1415138+Sayan-@users.noreply.github.com> Date: Wed, 24 Jun 2026 19:17:31 +0000 Subject: [PATCH 1/3] Make stop_timeout configurable at create and stop time The graceful stop grace period was hardcoded to a 5s default: the StopTimeout field existed on instance metadata but nothing ever set it, so it was always 0 and fell back to the default. Expose it as an optional stop_timeout on the create-instance request (persisted on the instance and also used by delete's graceful teardown) and as an optional per-call override in the stop request body. Precedence: stop-call override > instance-configured value > default. Co-Authored-By: Claude Opus 4.7 --- cmd/api/api/instances.go | 25 +- lib/builds/manager_test.go | 2 +- lib/instances/create.go | 1 + lib/instances/delete.go | 2 +- lib/instances/firecracker_test.go | 2 +- lib/instances/fork.go | 2 +- lib/instances/fork_speed_darwin_test.go | 2 +- lib/instances/lifecycle_noop_test.go | 2 +- lib/instances/manager.go | 9 +- lib/instances/manager_darwin_test.go | 6 +- lib/instances/manager_test.go | 4 +- lib/instances/qemu_test.go | 2 +- lib/instances/restart_policy.go | 2 +- lib/instances/stop.go | 13 +- lib/instances/stop_timeout_test.go | 32 ++ lib/instances/types.go | 1 + lib/instances/wait_test.go | 2 +- lib/oapi/oapi.go | 706 +++++++++++++----------- openapi.yaml | 30 + 19 files changed, 510 insertions(+), 335 deletions(-) create mode 100644 lib/instances/stop_timeout_test.go diff --git a/cmd/api/api/instances.go b/cmd/api/api/instances.go index d145fa9b..e881bd93 100644 --- a/cmd/api/api/instances.go +++ b/cmd/api/api/instances.go @@ -302,6 +302,17 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst }, nil } + stopTimeout := 0 + if request.Body.StopTimeout != nil { + if *request.Body.StopTimeout < 1 { + return oapi.CreateInstance400JSONResponse{ + Code: "invalid_stop_timeout", + Message: "stop_timeout must be at least 1 second", + }, nil + } + stopTimeout = *request.Body.StopTimeout + } + domainReq := instances.CreateInstanceRequest{ Name: request.Body.Name, Image: request.Body.Image, @@ -326,6 +337,7 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst Cmd: cmd, SkipKernelHeaders: request.Body.SkipKernelHeaders != nil && *request.Body.SkipKernelHeaders, SkipGuestAgent: request.Body.SkipGuestAgent != nil && *request.Body.SkipGuestAgent, + StopTimeout: stopTimeout, AutoStandby: autoStandby, HealthCheck: healthCheck, RestartPolicy: restartPolicy, @@ -754,7 +766,18 @@ func (s *ApiService) StopInstance(ctx context.Context, request oapi.StopInstance } log := logger.FromContext(ctx) - result, err := s.InstanceManager.StopInstance(ctx, inst.Id) + var stopTimeout *int + if request.Body != nil && request.Body.StopTimeout != nil { + if *request.Body.StopTimeout < 1 { + return oapi.StopInstance400JSONResponse{ + Code: "invalid_stop_timeout", + Message: "stop_timeout must be at least 1 second", + }, nil + } + stopTimeout = request.Body.StopTimeout + } + + result, err := s.InstanceManager.StopInstance(ctx, inst.Id, stopTimeout) if err != nil { switch { case errors.Is(err, instances.ErrInvalidState): diff --git a/lib/builds/manager_test.go b/lib/builds/manager_test.go index c26295ea..5f123534 100644 --- a/lib/builds/manager_test.go +++ b/lib/builds/manager_test.go @@ -121,7 +121,7 @@ func (m *mockInstanceManager) RestoreSnapshot(ctx context.Context, id string, sn return nil, instances.ErrNotSupported } -func (m *mockInstanceManager) StopInstance(ctx context.Context, id string) (*instances.Instance, error) { +func (m *mockInstanceManager) StopInstance(ctx context.Context, id string, stopTimeout *int) (*instances.Instance, error) { if m.stopFunc != nil { return m.stopFunc(ctx, id) } diff --git a/lib/instances/create.go b/lib/instances/create.go index 1bc6c867..aa764fb8 100644 --- a/lib/instances/create.go +++ b/lib/instances/create.go @@ -358,6 +358,7 @@ func (m *manager) createInstance( Cmd: req.Cmd, SkipKernelHeaders: req.SkipKernelHeaders, SkipGuestAgent: req.SkipGuestAgent, + StopTimeout: req.StopTimeout, EnableRosetta: enableRosetta, SnapshotPolicy: cloneSnapshotPolicy(req.SnapshotPolicy), AutoStandby: cloneAutoStandbyPolicy(req.AutoStandby), diff --git a/lib/instances/delete.go b/lib/instances/delete.go index 90236809..f53cc159 100644 --- a/lib/instances/delete.go +++ b/lib/instances/delete.go @@ -61,7 +61,7 @@ func (m *manager) deleteInstance( // 4. If active, try graceful guest shutdown before force kill. gracefulShutdown := false if inst.State == StateRunning || inst.State == StateInitializing { - stopTimeout := resolveStopTimeout(stored) + stopTimeout := resolveStopTimeout(stored, nil) if stopTimeout > deleteGracefulShutdownTimeout { stopTimeout = deleteGracefulShutdownTimeout } diff --git a/lib/instances/firecracker_test.go b/lib/instances/firecracker_test.go index 20fe7983..97d16f11 100644 --- a/lib/instances/firecracker_test.go +++ b/lib/instances/firecracker_test.go @@ -341,7 +341,7 @@ func TestFirecrackerStopClearsStaleSnapshot(t *testing.T) { require.NoError(t, err) require.True(t, beforeStop.HasSnapshot, "test setup should create visible stale snapshot") - inst, err = mgr.StopInstance(ctx, inst.Id) + inst, err = mgr.StopInstance(ctx, inst.Id, nil) require.NoError(t, err) assert.Equal(t, StateStopped, inst.State) assert.False(t, inst.HasSnapshot, "stopped instances should not retain stale snapshots") diff --git a/lib/instances/fork.go b/lib/instances/fork.go index ff8cfa25..5abf7e53 100644 --- a/lib/instances/fork.go +++ b/lib/instances/fork.go @@ -562,7 +562,7 @@ func (m *manager) applyForkTargetState(ctx context.Context, forkID string, targe inst, err := m.standbyInstance(ctx, forkID, StandbyInstanceRequest{}, false) return returnWithReadiness(inst, err, false) case StateStopped: - inst, err := m.stopInstance(ctx, forkID) + inst, err := m.stopInstance(ctx, forkID, nil) return returnWithReadiness(inst, err, false) } } diff --git a/lib/instances/fork_speed_darwin_test.go b/lib/instances/fork_speed_darwin_test.go index 2a91fca9..cfd9e02a 100644 --- a/lib/instances/fork_speed_darwin_test.go +++ b/lib/instances/fork_speed_darwin_test.go @@ -98,7 +98,7 @@ func TestVZForkSpeed(t *testing.T) { require.Equalf(t, 0, code, "dd to fill overlay should succeed") // Stop the source so each fork copies a stable on-disk state without booting. - _, err = mgr.StopInstance(ctx, source.Id) + _, err = mgr.StopInstance(ctx, source.Id, nil) require.NoError(t, err) // Reset the global reflink flag however the test exits — a require failure diff --git a/lib/instances/lifecycle_noop_test.go b/lib/instances/lifecycle_noop_test.go index b430b567..ba6ef730 100644 --- a/lib/instances/lifecycle_noop_test.go +++ b/lib/instances/lifecycle_noop_test.go @@ -106,7 +106,7 @@ func TestLifecycleNoopTransitionsReturnCurrentInstanceWithoutEvent(t *testing.T) name: "stop already stopped", state: StateStopped, action: func(ctx context.Context, m *manager, id string) (*Instance, error) { - return m.StopInstance(ctx, id) + return m.StopInstance(ctx, id, nil) }, }, } diff --git a/lib/instances/manager.go b/lib/instances/manager.go index b1bf7578..5c82e0fb 100644 --- a/lib/instances/manager.go +++ b/lib/instances/manager.go @@ -42,7 +42,7 @@ type Manager interface { StandbyInstance(ctx context.Context, id string, req StandbyInstanceRequest) (*Instance, error) RestoreInstance(ctx context.Context, id string) (*Instance, error) RestoreSnapshot(ctx context.Context, id string, snapshotID string, req RestoreSnapshotRequest) (*Instance, error) - StopInstance(ctx context.Context, id string) (*Instance, error) + StopInstance(ctx context.Context, id string, stopTimeout *int) (*Instance, error) StartInstance(ctx context.Context, id string, req StartInstanceRequest) (*Instance, error) UpdateInstance(ctx context.Context, id string, req UpdateInstanceRequest) (*Instance, error) StreamInstanceLogs(ctx context.Context, id string, tail int, follow bool, source LogSource) (<-chan string, error) @@ -609,8 +609,9 @@ func (m *manager) RestoreSnapshot(ctx context.Context, id string, snapshotID str return inst, err } -// StopInstance gracefully stops a running instance -func (m *manager) StopInstance(ctx context.Context, id string) (*Instance, error) { +// StopInstance gracefully stops a running instance. A non-nil stopTimeout +// overrides the instance's configured grace period for this call only. +func (m *manager) StopInstance(ctx context.Context, id string, stopTimeout *int) (*Instance, error) { lock := m.getInstanceLock(id) lock.Lock() defer lock.Unlock() @@ -631,7 +632,7 @@ func (m *manager) StopInstance(ctx context.Context, id string) (*Instance, error if err := m.markRestartManualStopLocked(ctx, id); err != nil { return nil, err } - inst, err := m.stopInstance(ctx, id) + inst, err := m.stopInstance(ctx, id, stopTimeout) if err == nil { m.notifyLifecycleEvent(ctx, LifecycleEventStop, inst) } diff --git a/lib/instances/manager_darwin_test.go b/lib/instances/manager_darwin_test.go index 2a3859e5..8425ba9f 100644 --- a/lib/instances/manager_darwin_test.go +++ b/lib/instances/manager_darwin_test.go @@ -182,7 +182,7 @@ func TestVZBasicLifecycle(t *testing.T) { // Graceful shutdown test t.Log("Stopping instance (graceful shutdown)...") - inst, err = mgr.StopInstance(ctx, inst.Id) + inst, err = mgr.StopInstance(ctx, inst.Id, nil) require.NoError(t, err) assert.Equal(t, StateStopped, inst.State) t.Log("Instance stopped") @@ -255,7 +255,7 @@ func TestVZBasicLifecycle(t *testing.T) { // Stop again before delete t.Log("Stopping instance before delete...") - inst, err = mgr.StopInstance(ctx, inst.Id) + inst, err = mgr.StopInstance(ctx, inst.Id, nil) require.NoError(t, err) assert.Equal(t, StateStopped, inst.State) @@ -359,7 +359,7 @@ func TestVZExecAndShutdown(t *testing.T) { // Graceful shutdown t.Log("Stopping instance...") - inst, err = mgr.StopInstance(ctx, inst.Id) + inst, err = mgr.StopInstance(ctx, inst.Id, nil) require.NoError(t, err) assert.Equal(t, StateStopped, inst.State) t.Log("Instance stopped gracefully") diff --git a/lib/instances/manager_test.go b/lib/instances/manager_test.go index 49a1f80b..9f5a733b 100644 --- a/lib/instances/manager_test.go +++ b/lib/instances/manager_test.go @@ -882,7 +882,7 @@ func TestBasicEndToEnd(t *testing.T) { // Test graceful stop: StopInstance sends Shutdown RPC -> init forwards SIGTERM // -> app exits -> init writes exit sentinel -> reboot(POWER_OFF) -> VM stops cleanly t.Log("Testing graceful stop via StopInstance...") - stoppedInst, err := manager.StopInstance(ctx, inst.Id) + stoppedInst, err := manager.StopInstance(ctx, inst.Id, nil) require.NoError(t, err, "StopInstance should succeed") assert.Equal(t, StateStopped, stoppedInst.State, "Instance should be in Stopped state after StopInstance") @@ -911,7 +911,7 @@ func TestBasicEndToEnd(t *testing.T) { t.Log("Restart test passed -- exit info cleared!") // Stop again before deleting - _, err = manager.StopInstance(ctx, inst.Id) + _, err = manager.StopInstance(ctx, inst.Id, nil) require.NoError(t, err) // Delete instance diff --git a/lib/instances/qemu_test.go b/lib/instances/qemu_test.go index e811a55c..b4565e9e 100644 --- a/lib/instances/qemu_test.go +++ b/lib/instances/qemu_test.go @@ -542,7 +542,7 @@ func TestQEMUBasicEndToEnd(t *testing.T) { // Test graceful stop: StopInstance sends Shutdown RPC -> init forwards SIGTERM // -> app exits -> init writes exit sentinel -> reboot(POWER_OFF) -> VM stops cleanly t.Log("Testing graceful stop via StopInstance...") - stoppedInst, err := manager.StopInstance(ctx, inst.Id) + stoppedInst, err := manager.StopInstance(ctx, inst.Id, nil) require.NoError(t, err, "StopInstance should succeed") assert.Equal(t, StateStopped, stoppedInst.State, "Instance should be in Stopped state after StopInstance") diff --git a/lib/instances/restart_policy.go b/lib/instances/restart_policy.go index 227b6c76..d1f6c562 100644 --- a/lib/instances/restart_policy.go +++ b/lib/instances/restart_policy.go @@ -173,7 +173,7 @@ func (m *manager) HandleHealthCheckUnhealthy(ctx context.Context, id string) err return err } - stopped, err := m.stopInstance(ctx, id) + stopped, err := m.stopInstance(ctx, id, nil) if err != nil { _ = m.updateRestartStatusLocked(id, restartStatusAfterFailedAttempt(policy, nextStatus, reason, now)) return err diff --git a/lib/instances/stop.go b/lib/instances/stop.go index fb60c68c..c95bb0ff 100644 --- a/lib/instances/stop.go +++ b/lib/instances/stop.go @@ -25,9 +25,13 @@ const shutdownFailureFallbackWait = 500 * time.Millisecond var errGracefulShutdownFailed = errors.New("graceful guest shutdown did not complete") -// resolveStopTimeout returns the configured stop timeout in seconds, -// falling back to the package default when unset/invalid. -func resolveStopTimeout(stored *StoredMetadata) int { +// resolveStopTimeout returns the stop timeout in seconds. A positive override +// (e.g. from a per-call stop request) wins; otherwise the instance's configured +// value is used, falling back to the package default when unset/invalid. +func resolveStopTimeout(stored *StoredMetadata, override *int) int { + if override != nil && *override > 0 { + return *override + } stopTimeout := stored.StopTimeout if stopTimeout <= 0 { stopTimeout = DefaultStopTimeout @@ -143,6 +147,7 @@ func (m *manager) forceKillHypervisorProcess(ctx context.Context, inst *Instance func (m *manager) stopInstance( ctx context.Context, id string, + stopTimeoutOverride *int, ) (_ *Instance, retErr error) { start := time.Now() log := logger.FromContext(ctx) @@ -185,7 +190,7 @@ func (m *manager) stopInstance( // 4. Graceful shutdown: send signal to guest init via Shutdown RPC, // then wait for VM to power off cleanly. Fall back to hypervisor shutdown on timeout. - stopTimeout := resolveStopTimeout(stored) + stopTimeout := resolveStopTimeout(stored, stopTimeoutOverride) gracefulCtx, gracefulSpanEnd := m.startLifecycleStep(ctx, "graceful_guest_shutdown", attribute.String("instance_id", id), attribute.String("hypervisor", string(stored.HypervisorType)), diff --git a/lib/instances/stop_timeout_test.go b/lib/instances/stop_timeout_test.go new file mode 100644 index 00000000..1de59207 --- /dev/null +++ b/lib/instances/stop_timeout_test.go @@ -0,0 +1,32 @@ +package instances + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResolveStopTimeout(t *testing.T) { + intPtr := func(v int) *int { return &v } + + tests := []struct { + name string + stored int + override *int + want int + }{ + {name: "unset uses default", stored: 0, override: nil, want: DefaultStopTimeout}, + {name: "negative stored uses default", stored: -3, override: nil, want: DefaultStopTimeout}, + {name: "configured value", stored: 12, override: nil, want: 12}, + {name: "override wins over configured", stored: 12, override: intPtr(30), want: 30}, + {name: "override wins over default", stored: 0, override: intPtr(30), want: 30}, + {name: "non-positive override ignored", stored: 12, override: intPtr(0), want: 12}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := resolveStopTimeout(&StoredMetadata{StopTimeout: tt.stored}, tt.override) + assert.Equal(t, tt.want, got) + }) + } +} diff --git a/lib/instances/types.go b/lib/instances/types.go index 6ff42406..98d83a9e 100644 --- a/lib/instances/types.go +++ b/lib/instances/types.go @@ -271,6 +271,7 @@ type CreateInstanceRequest struct { Cmd []string // Override image cmd (nil = use image default) SkipKernelHeaders bool // Skip kernel headers installation (disables DKMS) SkipGuestAgent bool // Skip guest-agent installation (disables exec/stat API) + StopTimeout int // Grace period in seconds for graceful stop (0 = use default 5s) SnapshotPolicy *SnapshotPolicy // Optional snapshot policy defaults for this instance AutoStandby *autostandby.Policy // Optional automatic standby policy HealthCheck *healthcheck.Policy // Optional workload health check policy diff --git a/lib/instances/wait_test.go b/lib/instances/wait_test.go index bab6f06d..c00760f5 100644 --- a/lib/instances/wait_test.go +++ b/lib/instances/wait_test.go @@ -57,7 +57,7 @@ func (s *stubManager) RestoreInstance(context.Context, string) (*Instance, error func (s *stubManager) RestoreSnapshot(context.Context, string, string, RestoreSnapshotRequest) (*Instance, error) { return nil, nil } -func (s *stubManager) StopInstance(context.Context, string) (*Instance, error) { return nil, nil } +func (s *stubManager) StopInstance(context.Context, string, *int) (*Instance, error) { return nil, nil } func (s *stubManager) StartInstance(context.Context, string, StartInstanceRequest) (*Instance, error) { return nil, nil } diff --git a/lib/oapi/oapi.go b/lib/oapi/oapi.go index f95fefd5..f4213dc3 100644 --- a/lib/oapi/oapi.go +++ b/lib/oapi/oapi.go @@ -548,6 +548,11 @@ type CreateInstanceRequest struct { SkipKernelHeaders *bool `json:"skip_kernel_headers,omitempty"` SnapshotPolicy *SnapshotPolicy `json:"snapshot_policy,omitempty"` + // StopTimeout Grace period in seconds for graceful shutdown when the instance is stopped + // or deleted, before falling back to a forced hypervisor shutdown. Omit to use + // the server default (5s). + StopTimeout *int `json:"stop_timeout,omitempty"` + // Tags User-defined key-value tags. Tags *Tags `json:"tags,omitempty"` @@ -1758,6 +1763,15 @@ type StatInstancePathParams struct { FollowLinks *bool `form:"follow_links,omitempty" json:"follow_links,omitempty"` } +// StopInstanceJSONBody defines parameters for StopInstance. +type StopInstanceJSONBody struct { + // StopTimeout Grace period in seconds for graceful shutdown for this stop only, + // before falling back to a forced hypervisor shutdown. Overrides the + // instance's configured stop_timeout. Omit to use the instance's + // configured value (or the server default). + StopTimeout *int `json:"stop_timeout,omitempty"` +} + // WaitForInstanceStateParams defines parameters for WaitForInstanceState. type WaitForInstanceStateParams struct { // State Target state to wait for @@ -1840,6 +1854,9 @@ type StandbyInstanceJSONRequestBody = StandbyInstanceRequest // StartInstanceJSONRequestBody defines body for StartInstance for application/json ContentType. type StartInstanceJSONRequestBody StartInstanceJSONBody +// StopInstanceJSONRequestBody defines body for StopInstance for application/json ContentType. +type StopInstanceJSONRequestBody StopInstanceJSONBody + // AttachVolumeJSONRequestBody defines body for AttachVolume for application/json ContentType. type AttachVolumeJSONRequestBody = AttachVolumeRequest @@ -2058,8 +2075,10 @@ type ClientInterface interface { // GetInstanceStats request GetInstanceStats(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) - // StopInstance request - StopInstance(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) + // StopInstanceWithBody request with any body + StopInstanceWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + StopInstance(ctx context.Context, id string, body StopInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // DetachVolume request DetachVolume(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2688,8 +2707,20 @@ func (c *Client) GetInstanceStats(ctx context.Context, id string, reqEditors ... return c.Client.Do(req) } -func (c *Client) StopInstance(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewStopInstanceRequest(c.Server, id) +func (c *Client) StopInstanceWithBody(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewStopInstanceRequestWithBody(c.Server, id, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) StopInstance(ctx context.Context, id string, body StopInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewStopInstanceRequest(c.Server, id, body) if err != nil { return nil, err } @@ -4478,8 +4509,19 @@ func NewGetInstanceStatsRequest(server string, id string) (*http.Request, error) return req, nil } -// NewStopInstanceRequest generates requests for StopInstance -func NewStopInstanceRequest(server string, id string) (*http.Request, error) { +// NewStopInstanceRequest calls the generic StopInstance builder with application/json body +func NewStopInstanceRequest(server string, id string, body StopInstanceJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewStopInstanceRequestWithBody(server, id, "application/json", bodyReader) +} + +// NewStopInstanceRequestWithBody generates requests for StopInstance with any type of body +func NewStopInstanceRequestWithBody(server string, id string, contentType string, body io.Reader) (*http.Request, error) { var err error var pathParam0 string @@ -4504,11 +4546,13 @@ func NewStopInstanceRequest(server string, id string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), nil) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } @@ -5378,8 +5422,10 @@ type ClientWithResponsesInterface interface { // GetInstanceStatsWithResponse request GetInstanceStatsWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*GetInstanceStatsResponse, error) - // StopInstanceWithResponse request - StopInstanceWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) + // StopInstanceWithBodyWithResponse request with any body + StopInstanceWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) + + StopInstanceWithResponse(ctx context.Context, id string, body StopInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) // DetachVolumeWithResponse request DetachVolumeWithResponse(ctx context.Context, id string, volumeId string, reqEditors ...RequestEditorFn) (*DetachVolumeResponse, error) @@ -6348,6 +6394,7 @@ type StopInstanceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *Instance + JSON400 *Error JSON404 *Error JSON409 *Error JSON500 *Error @@ -7133,9 +7180,17 @@ func (c *ClientWithResponses) GetInstanceStatsWithResponse(ctx context.Context, return ParseGetInstanceStatsResponse(rsp) } -// StopInstanceWithResponse request returning *StopInstanceResponse -func (c *ClientWithResponses) StopInstanceWithResponse(ctx context.Context, id string, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) { - rsp, err := c.StopInstance(ctx, id, reqEditors...) +// StopInstanceWithBodyWithResponse request with arbitrary body returning *StopInstanceResponse +func (c *ClientWithResponses) StopInstanceWithBodyWithResponse(ctx context.Context, id string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) { + rsp, err := c.StopInstanceWithBody(ctx, id, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseStopInstanceResponse(rsp) +} + +func (c *ClientWithResponses) StopInstanceWithResponse(ctx context.Context, id string, body StopInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*StopInstanceResponse, error) { + rsp, err := c.StopInstance(ctx, id, body, reqEditors...) if err != nil { return nil, err } @@ -8969,6 +9024,13 @@ func ParseStopInstanceResponse(rsp *http.Response) (*StopInstanceResponse, error } response.JSON200 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -13668,7 +13730,8 @@ func (response GetInstanceStats500JSONResponse) VisitGetInstanceStatsResponse(w } type StopInstanceRequestObject struct { - Id string `json:"id"` + Id string `json:"id"` + Body *StopInstanceJSONRequestBody } type StopInstanceResponseObject interface { @@ -13684,6 +13747,15 @@ func (response StopInstance200JSONResponse) VisitStopInstanceResponse(w http.Res return json.NewEncoder(w).Encode(response) } +type StopInstance400JSONResponse Error + +func (response StopInstance400JSONResponse) VisitStopInstanceResponse(w http.ResponseWriter) error { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(400) + + return json.NewEncoder(w).Encode(response) +} + type StopInstance404JSONResponse Error func (response StopInstance404JSONResponse) VisitStopInstanceResponse(w http.ResponseWriter) error { @@ -15516,6 +15588,13 @@ func (sh *strictHandler) StopInstance(w http.ResponseWriter, r *http.Request, id request.Id = id + var body StopInstanceJSONRequestBody + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + sh.options.RequestErrorHandlerFunc(w, r, fmt.Errorf("can't decode JSON body: %w", err)) + return + } + request.Body = &body + handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) { return sh.ssi.StopInstance(ctx, request.(StopInstanceRequestObject)) } @@ -15930,305 +16009,308 @@ func (sh *strictHandler) GetVolume(w http.ResponseWriter, r *http.Request, id st // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AA==", + "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", + "nz98/v8DAAD//60VG3mHmAEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/openapi.yaml b/openapi.yaml index 6168c18c..10a6ecfc 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -658,6 +658,14 @@ components: The instance will still run, but remote command execution will be unavailable. default: false example: false + stop_timeout: + type: integer + minimum: 1 + description: | + Grace period in seconds for graceful shutdown when the instance is stopped + or deleted, before falling back to a forced hypervisor shutdown. Omit to use + the server default (5s). + example: 30 entrypoint: type: array items: @@ -3053,6 +3061,22 @@ paths: schema: type: string description: Instance ID or name + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + stop_timeout: + type: integer + minimum: 1 + description: | + Grace period in seconds for graceful shutdown for this stop only, + before falling back to a forced hypervisor shutdown. Overrides the + instance's configured stop_timeout. Omit to use the instance's + configured value (or the server default). + example: 30 responses: 200: description: Instance stopped @@ -3060,6 +3084,12 @@ paths: application/json: schema: $ref: "#/components/schemas/Instance" + 400: + description: Invalid request + content: + application/json: + schema: + $ref: "#/components/schemas/Error" 404: description: Instance not found content: From 39655ca432336564db2218758d7b03210472686c Mon Sep 17 00:00:00 2001 From: Sayan- <1415138+Sayan-@users.noreply.github.com> Date: Wed, 24 Jun 2026 19:31:03 +0000 Subject: [PATCH 2/3] Extract shared stop_timeout validation helper Dedupe the stop_timeout range check and error message that were copy-pasted across the create and stop handlers into a single validateStopTimeout helper, matching the existing toDomain* helper convention. Stop passes the validated pointer straight through; create maps it to the domain int via lo.FromPtr. Co-Authored-By: Claude Opus 4.7 --- cmd/api/api/instances.go | 36 +++++++++++++++++------------------- cmd/api/api/stop_timeout.go | 13 +++++++++++++ 2 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 cmd/api/api/stop_timeout.go diff --git a/cmd/api/api/instances.go b/cmd/api/api/instances.go index e881bd93..e7c057c3 100644 --- a/cmd/api/api/instances.go +++ b/cmd/api/api/instances.go @@ -302,15 +302,12 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst }, nil } - stopTimeout := 0 - if request.Body.StopTimeout != nil { - if *request.Body.StopTimeout < 1 { - return oapi.CreateInstance400JSONResponse{ - Code: "invalid_stop_timeout", - Message: "stop_timeout must be at least 1 second", - }, nil - } - stopTimeout = *request.Body.StopTimeout + stopTimeout, err := validateStopTimeout(request.Body.StopTimeout) + if err != nil { + return oapi.CreateInstance400JSONResponse{ + Code: "invalid_stop_timeout", + Message: err.Error(), + }, nil } domainReq := instances.CreateInstanceRequest{ @@ -337,7 +334,7 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst Cmd: cmd, SkipKernelHeaders: request.Body.SkipKernelHeaders != nil && *request.Body.SkipKernelHeaders, SkipGuestAgent: request.Body.SkipGuestAgent != nil && *request.Body.SkipGuestAgent, - StopTimeout: stopTimeout, + StopTimeout: lo.FromPtr(stopTimeout), AutoStandby: autoStandby, HealthCheck: healthCheck, RestartPolicy: restartPolicy, @@ -766,15 +763,16 @@ func (s *ApiService) StopInstance(ctx context.Context, request oapi.StopInstance } log := logger.FromContext(ctx) - var stopTimeout *int - if request.Body != nil && request.Body.StopTimeout != nil { - if *request.Body.StopTimeout < 1 { - return oapi.StopInstance400JSONResponse{ - Code: "invalid_stop_timeout", - Message: "stop_timeout must be at least 1 second", - }, nil - } - stopTimeout = request.Body.StopTimeout + var requestedStopTimeout *int + if request.Body != nil { + requestedStopTimeout = request.Body.StopTimeout + } + stopTimeout, err := validateStopTimeout(requestedStopTimeout) + if err != nil { + return oapi.StopInstance400JSONResponse{ + Code: "invalid_stop_timeout", + Message: err.Error(), + }, nil } result, err := s.InstanceManager.StopInstance(ctx, inst.Id, stopTimeout) diff --git a/cmd/api/api/stop_timeout.go b/cmd/api/api/stop_timeout.go new file mode 100644 index 00000000..ef55588a --- /dev/null +++ b/cmd/api/api/stop_timeout.go @@ -0,0 +1,13 @@ +package api + +import "fmt" + +// validateStopTimeout normalizes an optional stop_timeout (seconds) from a +// request body, rejecting non-positive values. A nil input or result means the +// caller falls back to the instance's configured value or the server default. +func validateStopTimeout(v *int) (*int, error) { + if v != nil && *v < 1 { + return nil, fmt.Errorf("stop_timeout must be at least 1 second") + } + return v, nil +} From e26b4d1171d4d6cacd3eb9c8dd6bb098965001b5 Mon Sep 17 00:00:00 2001 From: Sayan- <1415138+Sayan-@users.noreply.github.com> Date: Wed, 24 Jun 2026 19:59:45 +0000 Subject: [PATCH 3/3] Surface stop_timeout on the Instance response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stop_timeout was settable at create but not returned on the Instance object, so clients couldn't read back what they configured. Add it to the Instance schema and map it in instanceToOAPI, emitting the configured value when set and omitting it when unset (server default applies) — symmetric with the request-side semantics. Co-Authored-By: Claude Opus 4.7 --- cmd/api/api/instances.go | 4 + cmd/api/api/instances_test.go | 38 ++++ lib/oapi/oapi.go | 339 +++++++++++++++++----------------- openapi.yaml | 4 + 4 files changed, 217 insertions(+), 168 deletions(-) diff --git a/cmd/api/api/instances.go b/cmd/api/api/instances.go index e7c057c3..35fb5745 100644 --- a/cmd/api/api/instances.go +++ b/cmd/api/api/instances.go @@ -1183,6 +1183,10 @@ func instanceToOAPI(inst instances.Instance) oapi.Instance { oapiInst.ExitMessage = lo.ToPtr(inst.ExitMessage) } + if inst.StopTimeout > 0 { + oapiInst.StopTimeout = lo.ToPtr(inst.StopTimeout) + } + if len(inst.Env) > 0 { oapiInst.Env = &inst.Env } diff --git a/cmd/api/api/instances_test.go b/cmd/api/api/instances_test.go index 5b174be0..0059c38f 100644 --- a/cmd/api/api/instances_test.go +++ b/cmd/api/api/instances_test.go @@ -635,6 +635,44 @@ func TestInstanceToOAPI_OmitsPlatformWhenUnset(t *testing.T) { assert.Nil(t, oapiInst.Platform) } +func TestInstanceToOAPI_EchoesStopTimeout(t *testing.T) { + t.Parallel() + + inst := instances.Instance{ + StoredMetadata: instances.StoredMetadata{ + Id: "inst-stop-timeout", + Name: "inst-stop-timeout", + Image: "docker.io/library/alpine:latest", + CreatedAt: time.Now(), + HypervisorType: hypervisor.TypeCloudHypervisor, + StopTimeout: 30, + }, + State: instances.StateRunning, + } + + oapiInst := instanceToOAPI(inst) + require.NotNil(t, oapiInst.StopTimeout) + assert.Equal(t, 30, *oapiInst.StopTimeout) +} + +func TestInstanceToOAPI_OmitsStopTimeoutWhenUnset(t *testing.T) { + t.Parallel() + + inst := instances.Instance{ + StoredMetadata: instances.StoredMetadata{ + Id: "inst-no-stop-timeout", + Name: "inst-no-stop-timeout", + Image: "docker.io/library/alpine:latest", + CreatedAt: time.Now(), + HypervisorType: hypervisor.TypeCloudHypervisor, + }, + State: instances.StateStopped, + } + + oapiInst := instanceToOAPI(inst) + assert.Nil(t, oapiInst.StopTimeout) +} + // errCreateInstanceManager is a fake whose CreateInstance always fails with a // preset error, used to assert the handler maps typed image errors to statuses. type errCreateInstanceManager struct { diff --git a/lib/oapi/oapi.go b/lib/oapi/oapi.go index f4213dc3..b2495398 100644 --- a/lib/oapi/oapi.go +++ b/lib/oapi/oapi.go @@ -1090,6 +1090,9 @@ type Instance struct { // StateError Error message if state couldn't be determined (only set when state is Unknown) StateError *string `json:"state_error"` + // StopTimeout Configured grace period in seconds for graceful shutdown on stop/delete. Omitted when unset (the server default applies). + StopTimeout *int `json:"stop_timeout,omitempty"` + // StoppedAt Stop timestamp (RFC3339) StoppedAt *time.Time `json:"stopped_at"` @@ -16143,174 +16146,174 @@ var swaggerSpec = []string{ "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", - "nz98/v8DAAD//60VG3mHmAEA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/openapi.yaml b/openapi.yaml index 10a6ecfc..09c86a3c 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1099,6 +1099,10 @@ components: type: boolean description: Whether a snapshot exists for this instance example: false + stop_timeout: + type: integer + description: Configured grace period in seconds for graceful shutdown on stop/delete. Omitted when unset (the server default applies). + example: 30 hypervisor: type: string enum: [cloud-hypervisor, firecracker, qemu, vz]