From a0c1f69ae2e17bc6a938c1a1044cdb33276b7a65 Mon Sep 17 00:00:00 2001 From: Jeff Mitchell Date: Thu, 20 May 2021 20:07:22 -0500 Subject: [PATCH] Already-canceled sessions return 200 (#1243) If a session is already canceled or terminated, attempting to cancel it will return the current session state and a 200, instead of an error. --- CHANGELOG.md | 12 ++++++++++++ .../handlers/sessions/session_service.go | 15 ++++++++------- .../handlers/sessions/session_service_test.go | 3 +-- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b77d9fe1..5331de557 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ Canonical reference for changes, improvements, and bugfixes for Boundary. ## Next +### Deprecations/Changes + +* If a `cancel` operation is run on a session already in a canceling or + terminated state, a `200` and the session information will be returned instead + of an error. + +### New and Improved + +* sessions: Return a `200` and session information when canceling an + already-canceled or terminated session + ([PR](https://github.com/hashicorp/boundary/pull/1243)) + ## 0.2.2 (2021/05/17) ### New and Improved diff --git a/internal/servers/controller/handlers/sessions/session_service.go b/internal/servers/controller/handlers/sessions/session_service.go index ecd242393..42c60f6e2 100644 --- a/internal/servers/controller/handlers/sessions/session_service.go +++ b/internal/servers/controller/handlers/sessions/session_service.go @@ -237,18 +237,19 @@ func (s Service) CancelSession(ctx context.Context, req *pbs.CancelSessionReques } } + var skipCancel bool for _, state := range ses.States { switch state.Status { - case session.StatusCanceling: - return nil, errors.New(errors.InvalidSessionState, op, "session already in canceling state") - case session.StatusTerminated: - return nil, errors.New(errors.InvalidSessionState, op, "session already terminated") + case session.StatusCanceling, session.StatusTerminated: + skipCancel = true } } - ses, err = s.cancelInRepo(ctx, req.GetId(), req.GetVersion()) - if err != nil { - return nil, err + if !skipCancel { + ses, err = s.cancelInRepo(ctx, req.GetId(), req.GetVersion()) + if err != nil { + return nil, err + } } outputOpts := make([]handlers.Option, 0, 3) diff --git a/internal/servers/controller/handlers/sessions/session_service_test.go b/internal/servers/controller/handlers/sessions/session_service_test.go index ad13af01f..d12a26dca 100644 --- a/internal/servers/controller/handlers/sessions/session_service_test.go +++ b/internal/servers/controller/handlers/sessions/session_service_test.go @@ -521,8 +521,7 @@ func TestCancel(t *testing.T) { name: "Already canceled", scopeId: sess.ScopeId, req: &pbs.CancelSessionRequest{Id: sess.GetPublicId()}, - res: nil, - err: errors.New(errors.InvalidSessionState, "sessions.(Service).CancelSession", "session already in canceling state"), + res: &pbs.CancelSessionResponse{Item: wireSess}, }, { name: "Cancel a non existing Session",