|
1 | 1 | package io.hydrosphere.mist.master.interfaces.http
|
2 | 2 |
|
3 | 3 | import akka.http.scaladsl.Http
|
4 |
| -import java.io.File |
| 4 | +import java.io.{PrintWriter, StringWriter, File} |
5 | 5 |
|
6 | 6 | import akka.http.scaladsl.marshalling.{ToEntityMarshaller, ToResponseMarshallable}
|
7 | 7 | import akka.http.scaladsl.model._
|
@@ -30,6 +30,7 @@ import scala.concurrent.ExecutionContext.Implicits.global
|
30 | 30 | import scala.concurrent.Future
|
31 | 31 | import scala.concurrent.duration.Duration
|
32 | 32 | import scala.util._
|
| 33 | +import cats.data.NonEmptyList |
33 | 34 |
|
34 | 35 | case class JobRunQueryParams(
|
35 | 36 | force: Boolean,
|
@@ -111,11 +112,11 @@ object HttpV2Base {
|
111 | 112 | }
|
112 | 113 | }
|
113 | 114 |
|
114 |
| - val statusesQuery: Directive1[Seq[JobDetails.Status]] = { |
| 115 | + val statusesQuery: Directive1[Option[NonEmptyList[JobDetails.Status]]] = { |
115 | 116 | parameter('status *).flatMap(raw => {
|
116 | 117 | toStatuses(raw) match {
|
117 | 118 | case Left(errors) => reject(ValidationRejection(s"Unknown statuses: ${errors.mkString(",")}"))
|
118 |
| - case Right(validated) => provide(validated) |
| 119 | + case Right(validated) => provide(NonEmptyList.fromList(validated)) |
119 | 120 | }
|
120 | 121 | })
|
121 | 122 | }
|
@@ -170,9 +171,9 @@ object HttpV2Routes extends Logger {
|
170 | 171 | }
|
171 | 172 | } ~
|
172 | 173 | path( root / "workers"/ Segment / "jobs") { workerId =>
|
173 |
| - get { (paginationQuery & statusesQuery) { (pagination, statuses) => |
| 174 | + get { (paginationQuery & statusesQuery) { (pagination, maybeStatuses) => |
174 | 175 | val req = JobDetailsRequest(pagination.limit, pagination.offset)
|
175 |
| - .withFilter(FilterClause.ByStatuses(statuses)) |
| 176 | + .withOptFilter(maybeStatuses.map(FilterClause.ByStatuses)) |
176 | 177 | .withFilter(FilterClause.ByWorkerId(workerId))
|
177 | 178 |
|
178 | 179 | onSuccess(jobService.getHistory(req))(rsp => {
|
@@ -231,9 +232,9 @@ object HttpV2Routes extends Logger {
|
231 | 232 |
|
232 | 233 | def functionsJobs(main: MainService): Route = {
|
233 | 234 | path( root / "functions" / Segment / "jobs" ) { functionId =>
|
234 |
| - get { (paginationQuery & statusesQuery) { (pagination, statuses) => |
| 235 | + get { (paginationQuery & statusesQuery) { (pagination, maybeStatuses) => |
235 | 236 | val req = JobDetailsRequest(pagination.limit, pagination.offset)
|
236 |
| - .withFilter(FilterClause.ByStatuses(statuses)) |
| 237 | + .withOptFilter(maybeStatuses.map(FilterClause.ByStatuses)) |
237 | 238 | .withFilter(FilterClause.ByFunctionId(functionId))
|
238 | 239 |
|
239 | 240 | onSuccess(main.execution.getHistory(req))(rsp => {
|
@@ -343,9 +344,9 @@ object HttpV2Routes extends Logger {
|
343 | 344 | def jobsRoutes(master: MainService): Route = {
|
344 | 345 | pathPrefix( root / "jobs") {
|
345 | 346 | pathEnd {
|
346 |
| - get { (paginationQuery & statusesQuery) { (pagination, statuses) => |
| 347 | + get { (paginationQuery & statusesQuery) { (pagination, maybeStatuses) => |
347 | 348 | val req = JobDetailsRequest(pagination.limit, pagination.offset)
|
348 |
| - .withFilter(FilterClause.ByStatuses(statuses)) |
| 349 | + .withOptFilter(maybeStatuses.map(FilterClause.ByStatuses)) |
349 | 350 |
|
350 | 351 | onSuccess(master.execution.getHistory(req))(rsp => {
|
351 | 352 | if (pagination.paginate)
|
@@ -432,13 +433,22 @@ object HttpV2Routes extends Logger {
|
432 | 433 | }
|
433 | 434 |
|
434 | 435 | def apiRoutes(main: MainService, artifacts: ArtifactRepository, mistHome: String): Route = {
|
435 |
| - val exceptionHandler = |
436 |
| - ExceptionHandler { |
| 436 | + val exceptionHandler = ExceptionHandler({ case e => { |
| 437 | + val (status, msg) = e match { |
437 | 438 | case ex @ (_: IllegalArgumentException | _: IllegalStateException) =>
|
438 |
| - complete((StatusCodes.BadRequest, s"Bad request: ${ex.getMessage}")) |
| 439 | + (StatusCodes.BadRequest, "Bad request") |
439 | 440 | case ex =>
|
440 |
| - complete(HttpResponse(StatusCodes.InternalServerError, entity = s"Server error: ${ex.getMessage}")) |
| 441 | + (StatusCodes.InternalServerError, "Server error") |
441 | 442 | }
|
| 443 | + val errorMsg = { |
| 444 | + val writer = new StringWriter() |
| 445 | + e.printStackTrace(new PrintWriter(writer)) |
| 446 | + writer.toString |
| 447 | + } |
| 448 | + val fullMsg = msg + ":\n" + errorMsg |
| 449 | + complete(HttpResponse(status, entity = fullMsg)) |
| 450 | + }}) |
| 451 | + |
442 | 452 | handleExceptions(exceptionHandler) {
|
443 | 453 | functionAllRoutes(main) ~
|
444 | 454 | jobsRoutes(main) ~
|
|
0 commit comments