You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@texera.apache.org by gi...@apache.org on 2026/07/20 19:37:59 UTC
(texera) 01/01: fix(computing-unit): return 404 instead of 500 when getOwner is called for a nonexistent unit (#6612)
This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-6612-42027e8c38d248a60cab32871887bc754ef311b5
in repository https://gitbox.apache.org/repos/asf/texera.git
commit 3a671c31ffe7f5a48da5b2e98841b0d55e176acc
Author: Prateek Ganigi <91...@users.noreply.github.com>
AuthorDate: Mon Jul 20 12:37:38 2026 -0700
fix(computing-unit): return 404 instead of 500 when getOwner is called for a nonexistent unit (#6612)
### What changes were proposed in this PR?
ComputingUnitAccessResource.getOwner (GET
/access/computing-unit/owner/{cuid}) threw a plain
IllegalArgumentException when the requested unit didn't exist:
if (unit == null) {
throw new IllegalArgumentException("Computing unit does not exist")
}
The service registers no ExceptionMapper for IllegalArgumentException
(only UnauthorizedExceptionMapper), so it fell through to Dropwizard's
default LoggingExceptionMapper and surfaced as an opaque HTTP 500 rather
than a proper client error.
This PR throws jakarta.ws.rs.NotFoundException instead, so a nonexistent
unit now returns a 404. This is the same unmapped-exception→500 pattern
fixed for grantAccess/revokeAccess in #6446; getOwner was outside that
PR's diff. The choice of 404 and the message style match the
same-service convention in ComputingUnitManagingResource (throw new
NotFoundException(s"Computing unit with cuid=$cuid does not exist.")).
Note: getOwner also dereferences userDao.fetchOneByUid(uid).getEmail
without a null-check. That path is unreachable in practice,
workflow_computing_unit.uid is REFERENCES "user"(uid) ON DELETE CASCADE,
so a unit cannot outlive its owner, so it's intentionally left out of
this focused fix and tracked with the broader coverage work in #6490.
### Any related issues, documentation, discussions?
Closes #6475
### How was this PR tested?
Added a getOwner test to ComputingUnitAccessResourceSpec (embedded
Postgres via MockTexeraDB, reusing the wiring from #6446) that requests
a nonexistent cuid and asserts the JAX-RS NotFoundException and its
resolved 404 status:
"getOwner" should "reject a nonexistent computing unit with a 404
instead of crashing" in {
val ex = intercept[NotFoundException] {
accessResource.getOwner(ownerSession, nonExistentCuid)
}
ex.getResponse.getStatus shouldEqual 404
ex.getMessage should include(s"Computing unit with cuid=$nonExistentCuid
does not exist")
}
Verified red→green: against the old IllegalArgumentException the test
fails with "Expected exception jakarta.ws.rs.NotFoundException … but
java.lang.IllegalArgumentException was thrown"; after the fix all 9
tests in the spec pass. Scalafmt clean.
Run:
sbt "ComputingUnitManagingService/testOnly
org.apache.texera.service.resource.ComputingUnitAccessResourceSpec"
### Was this PR authored or co-authored using generative AI tooling?
Co-authored with Claude Opus 4.8 in compliance with ASF.
---
.../service/resource/ComputingUnitAccessResource.scala | 5 ++++-
.../resource/ComputingUnitAccessResourceSpec.scala | 15 ++++++++++++++-
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/computing-unit-managing-service/src/main/scala/org/apache/texera/service/resource/ComputingUnitAccessResource.scala b/computing-unit-managing-service/src/main/scala/org/apache/texera/service/resource/ComputingUnitAccessResource.scala
index 9ed77ead1f..88fba414b1 100644
--- a/computing-unit-managing-service/src/main/scala/org/apache/texera/service/resource/ComputingUnitAccessResource.scala
+++ b/computing-unit-managing-service/src/main/scala/org/apache/texera/service/resource/ComputingUnitAccessResource.scala
@@ -214,7 +214,10 @@ class ComputingUnitAccessResource {
val workflowComputingUnitDao = new WorkflowComputingUnitDao(ctx.configuration())
val unit = workflowComputingUnitDao.fetchOneByCuid(cuid)
if (unit == null) {
- throw new IllegalArgumentException("Computing unit does not exist")
+ // JAX-RS exception so it maps to 404: the service registers no ExceptionMapper
+ // for IllegalArgumentException, which would otherwise surface as an HTTP 500.
+ // Message style matches ComputingUnitManagingResource's nonexistent-unit error.
+ throw new NotFoundException(s"Computing unit with cuid=$cuid does not exist.")
}
val uid = unit.getUid
diff --git a/computing-unit-managing-service/src/test/scala/org/apache/texera/service/resource/ComputingUnitAccessResourceSpec.scala b/computing-unit-managing-service/src/test/scala/org/apache/texera/service/resource/ComputingUnitAccessResourceSpec.scala
index 56c098049a..7637c99d26 100644
--- a/computing-unit-managing-service/src/test/scala/org/apache/texera/service/resource/ComputingUnitAccessResourceSpec.scala
+++ b/computing-unit-managing-service/src/test/scala/org/apache/texera/service/resource/ComputingUnitAccessResourceSpec.scala
@@ -19,7 +19,7 @@
package org.apache.texera.service.resource
-import jakarta.ws.rs.{BadRequestException, ForbiddenException}
+import jakarta.ws.rs.{BadRequestException, ForbiddenException, NotFoundException}
import org.apache.texera.auth.SessionUser
import org.apache.texera.common.config.ComputingUnitConfig
import org.apache.texera.dao.MockTexeraDB
@@ -90,6 +90,7 @@ class ComputingUnitAccessResourceSpec
}
private val nonExistentEmail: String = "nobody@test.com"
+ private val nonExistentCuid: Integer = 999999
lazy val accessResource = new ComputingUnitAccessResource()
@@ -201,4 +202,16 @@ class ComputingUnitAccessResourceSpec
ex.getResponse.getStatus shouldEqual 403
ex.getMessage should include("does not have permission to revoke access")
}
+
+ // ===========================================================================
+ // getOwner
+ // ===========================================================================
+
+ "getOwner" should "reject a nonexistent computing unit with a 404 instead of crashing" in {
+ val ex = intercept[NotFoundException] {
+ accessResource.getOwner(ownerSession, nonExistentCuid)
+ }
+ ex.getResponse.getStatus shouldEqual 404
+ ex.getMessage should include(s"Computing unit with cuid=$nonExistentCuid does not exist")
+ }
}