diff --git a/cmd/api/api/instances.go b/cmd/api/api/instances.go index d145fa9b..35fb5745 100644 --- a/cmd/api/api/instances.go +++ b/cmd/api/api/instances.go @@ -302,6 +302,14 @@ func (s *ApiService) CreateInstance(ctx context.Context, request oapi.CreateInst }, nil } + stopTimeout, err := validateStopTimeout(request.Body.StopTimeout) + if err != nil { + return oapi.CreateInstance400JSONResponse{ + Code: "invalid_stop_timeout", + Message: err.Error(), + }, nil + } + domainReq := instances.CreateInstanceRequest{ Name: request.Body.Name, Image: request.Body.Image, @@ -326,6 +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: lo.FromPtr(stopTimeout), AutoStandby: autoStandby, HealthCheck: healthCheck, RestartPolicy: restartPolicy, @@ -754,7 +763,19 @@ func (s *ApiService) StopInstance(ctx context.Context, request oapi.StopInstance } log := logger.FromContext(ctx) - result, err := s.InstanceManager.StopInstance(ctx, inst.Id) + 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) if err != nil { switch { case errors.Is(err, instances.ErrInvalidState): @@ -1162,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/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 +} 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..b2495398 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"` @@ -1085,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"` @@ -1758,6 +1766,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 +1857,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 +2078,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 +2710,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 +4512,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 +4549,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 +5425,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 +6397,7 @@ type StopInstanceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *Instance + JSON400 *Error JSON404 *Error JSON409 *Error JSON500 *Error @@ -7133,9 +7183,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 +9027,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 +13733,8 @@ func (response GetInstanceStats500JSONResponse) VisitGetInstanceStatsResponse(w } type StopInstanceRequestObject struct { - Id string `json:"id"` + Id string `json:"id"` + Body *StopInstanceJSONRequestBody } type StopInstanceResponseObject interface { @@ -13684,6 +13750,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 +15591,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 +16012,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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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/openapi.yaml b/openapi.yaml index 6168c18c..09c86a3c 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: @@ -1091,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] @@ -3053,6 +3065,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 +3088,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: