From b6cf6c3b8d4a4da03192c9b7db56d531792b52ab Mon Sep 17 00:00:00 2001
From: Sam Kagan <skagan@nrao.edu>
Date: Tue, 11 Jun 2024 17:29:29 -0600
Subject: [PATCH] Switched returns to raises for error responses in views where
 a db transacation appeared to be open with some modified data

---
 services/capability/capability/views/capability.py   |  9 ++++++---
 .../capability/views/capability_request.py           | 12 ++++++++----
 .../capability/views/capability_version.py           |  3 ++-
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/services/capability/capability/views/capability.py b/services/capability/capability/views/capability.py
index 9dd94bbc4..aef1c7f90 100644
--- a/services/capability/capability/views/capability.py
+++ b/services/capability/capability/views/capability.py
@@ -160,7 +160,8 @@ def edit_capability(request: Request) -> Response:
         if success:
             return Response(body="Capability successfully edited!")
         else:
-            return HTTPExpectationFailed(detail=f"Unable to edit capability {capability_name}.")
+            # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+            raise HTTPExpectationFailed(detail=f"Unable to edit capability {capability_name}.")
 
 
 @view_config(route_name="enable_capability", renderer="json")
@@ -184,7 +185,8 @@ def enable_capability(request: Request) -> Response:
         if success:
             return Response(body="Capability successfully enabled!")
         else:
-            return HTTPExpectationFailed(detail=f"Unable to enable capability {capability_name}.")
+            # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+            raise HTTPExpectationFailed(detail=f"Unable to enable capability {capability_name}.")
 
 
 @view_config(route_name="disable_capability", renderer="json")
@@ -208,7 +210,8 @@ def disable_capability(request: Request) -> Response:
         if success:
             return Response(body="Capability successfully disabled!")
         else:
-            return HTTPExpectationFailed(detail=f"Unable to disable capability {capability_name}.")
+            # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+            raise HTTPExpectationFailed(detail=f"Unable to disable capability {capability_name}.")
 
 
 @view_config(route_name="pause_capability", renderer="json")
diff --git a/services/capability/capability/views/capability_request.py b/services/capability/capability/views/capability_request.py
index dc4e7f859..30878378f 100644
--- a/services/capability/capability/views/capability_request.py
+++ b/services/capability/capability/views/capability_request.py
@@ -237,7 +237,8 @@ def close_capability_request(request: Request) -> Response:
                 request.capability_info.save_entity(capability_request)
             except Exception as exc:
                 detail = f"sealing of {capability_request.id} failed: {exc}"
-                return HTTPBadRequest(detail=detail)
+                # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+                raise HTTPBadRequest(detail=detail)
 
             return Response(body=f"Capability request with ID {request_id} successfully closed.")
         else:
@@ -277,7 +278,8 @@ def delete_capability_request(request: Request) -> Response:
             f"Capability request for {capability_name} with ID {request_id} cannot be deleted;",
             "it has existing executions.",
         )
-        return HTTPBadRequest(detail=bad_request_msg)
+        # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+        raise HTTPBadRequest(detail=bad_request_msg)
     return Response(body=f"Capability request for {capability_name} with ID {request_id} successfully deleted.")
 
 
@@ -335,7 +337,8 @@ def assign_capability_request(request: Request) -> Response:
         request.capability_info.save_entity(capability_request)
     except Exception as exc:
         detail = f"assignment of {user_name} as {group} to request {request_id} failed: {exc}"
-        return HTTPBadRequest(detail=detail)
+        # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+        raise HTTPBadRequest(detail=detail)
 
     return Response(json_body={"resp": response_body})
 
@@ -409,6 +412,7 @@ def change_srdp_compatibility_version_metadata(request: Request) -> Response:
     r = requests.post(change_srdp_url, json=request.json_body)
     if r.status_code != requests.codes.ok:
         srdp_change_failed_msg = f"SRDP-Compatibility change failed: {r.status_code}"
-        return HTTPInternalServerError(detail=srdp_change_failed_msg)
+        # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+        raise HTTPInternalServerError(detail=srdp_change_failed_msg)
 
     return request.json_body
diff --git a/services/capability/capability/views/capability_version.py b/services/capability/capability/views/capability_version.py
index 803231f09..6348ba3f6 100644
--- a/services/capability/capability/views/capability_version.py
+++ b/services/capability/capability/views/capability_version.py
@@ -177,7 +177,8 @@ def update_internal_notes(request: Request) -> Response:
             )
         else:
             no_versions_msg = f"Capability request with ID {capability_request_id} has no version {version_id}"
-            return HTTPPreconditionFailed(no_versions_msg)
+            # Need to raise on failure when a transaction is in-progress so that it rolls back instead of committing
+            raise HTTPPreconditionFailed(no_versions_msg)
     else:
         not_found_msg = f"Capability request with ID {capability_request_id} not found."
         return HTTPNotFound(detail=not_found_msg)
-- 
GitLab