Skip to content

Commit

Permalink
[DPP-621][Self-service error codes] Adopt error codes in ApiVersionSe…
Browse files Browse the repository at this point in the history
…rvice (#11302)

CHANGELOG_BEGIN
CHANGELOG_END
  • Loading branch information
pbatko-da authored Oct 21, 2021
1 parent ed9dbed commit 443b64d
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -609,4 +609,21 @@ object LedgerApiErrors extends LedgerApiErrorGroup {
cause = s"Offset in ${fieldName} not specified in hexadecimal: ${offsetValue}: ${message}"
)
}

object VersionServiceError extends ErrorGroup {
@Explanation("This error occurs if there was an unexpected error within the version service.")
@Resolution("Contact support.")
object InternalError
extends ErrorCode(
id = "VERSION_SERVICE_INTERNAL_ERROR",
ErrorCategory.SystemInternalAssumptionViolated,
) {

case class Reject(message: String)(implicit
loggingContext: ContextualizedErrorLogger
) extends LoggingTransactionErrorImpl(cause = message)

}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import com.daml.error.definitions.LedgerApiErrors
import com.daml.error.{ContextualizedErrorLogger, ErrorCodesVersionSwitcher}
import com.daml.ledger.api.domain.LedgerId
import com.daml.ledger.grpc.GrpcStatuses
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.lf.data.Ref.TransactionId
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.platform.server.api.validation.ErrorFactories.{
addDefiniteAnswerDetails,
definiteAnswers,
Expand Down Expand Up @@ -66,6 +66,16 @@ class ErrorFactories private (errorCodesVersionSwitcher: ErrorCodesVersionSwitch
v2 = LedgerApiErrors.ReadErrors.PackageNotFound.Reject(packageId = packageId).asGrpcError,
)

def versionServiceInternalError(message: String)(implicit
contextualizedErrorLogger: ContextualizedErrorLogger
): StatusRuntimeException =
errorCodesVersionSwitcher.choose(
v1 = io.grpc.Status.INTERNAL
.withDescription(message)
.asRuntimeException(),
v2 = LedgerApiErrors.VersionServiceError.InternalError.Reject(message).asGrpcError,
)

def duplicateCommandException(implicit
contextualizedErrorLogger: ContextualizedErrorLogger
): StatusRuntimeException =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,21 @@ class ErrorFactoriesSpec extends AnyWordSpec with Matchers with TableDrivenPrope
)
}

"return the internalError" in {
assertVersionedError(_.versionServiceInternalError("message123"))(
v1_code = Code.INTERNAL,
v1_message = "message123",
v1_details = Seq.empty,
v2_code = Code.INTERNAL,
v2_message =
s"An error occurred. Please contact the operator and inquire about the request trace-id",
v2_details = Seq[ErrorDetails.ErrorDetail](
ErrorDetails.ErrorInfoDetail("VERSION_SERVICE_INTERNAL_ERROR"),
DefaultTraceIdRequestInfo,
),
)
}

"return a transactionNotFound error" in {
assertVersionedError(_.transactionNotFound(Ref.TransactionId.assertFromString("tId")))(
v1_code = Code.NOT_FOUND,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ private[daml] object ApiServices {
ApiLedgerIdentityService.create(() => identityService.getLedgerId(), errorsVersionsSwitcher)

val apiVersionService =
ApiVersionService.create()
ApiVersionService.create(errorsVersionsSwitcher)

val apiPackageService =
ApiPackageService.create(ledgerId, packagesService, errorsVersionsSwitcher)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,41 @@

package com.daml.platform.apiserver.services

import com.daml.ledger.api.v1.version_service.GetLedgerApiVersionRequest
import com.daml.ledger.api.v1.version_service.GetLedgerApiVersionResponse
import com.daml.ledger.api.v1.version_service.VersionServiceGrpc
import com.daml.error.{
ContextualizedErrorLogger,
DamlContextualizedErrorLogger,
ErrorCodesVersionSwitcher,
}
import com.daml.ledger.api.v1.version_service.VersionServiceGrpc.VersionService
import com.daml.logging.ContextualizedLogger
import com.daml.logging.LoggingContext
import com.daml.ledger.api.v1.version_service.{
GetLedgerApiVersionRequest,
GetLedgerApiVersionResponse,
VersionServiceGrpc,
}
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.platform.api.grpc.GrpcApiService
import com.daml.platform.server.api.validation.ErrorFactories
import io.grpc.ServerServiceDefinition
import io.grpc.Status

import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import scala.concurrent.{ExecutionContext, Future}
import scala.io.Source
import scala.util.Try
import scala.util.control.NonFatal

private[apiserver] final class ApiVersionService private (implicit
private[apiserver] final class ApiVersionService private (
errorCodesVersionSwitcher: ErrorCodesVersionSwitcher
)(implicit
loggingContext: LoggingContext,
ec: ExecutionContext,
) extends VersionService
with GrpcApiService {

private val logger = ContextualizedLogger.get(this.getClass)

private val errorFactories = ErrorFactories(errorCodesVersionSwitcher)
private implicit val contextualizedErrorLogger: ContextualizedErrorLogger =
new DamlContextualizedErrorLogger(logger, loggingContext, None)

private val versionFile: String = "ledger-api/VERSION"
private lazy val apiVersion: Try[String] = readVersion(versionFile)

Expand All @@ -43,9 +54,7 @@ private[apiserver] final class ApiVersionService private (implicit

private lazy val internalError: Future[Nothing] =
Future.failed(
Status.INTERNAL
.withDescription("Cannot read Ledger API version")
.asRuntimeException()
errorFactories.versionServiceInternalError(message = "Cannot read Ledger API version")
)

private def readVersion(versionFileName: String): Try[String] =
Expand All @@ -65,6 +74,8 @@ private[apiserver] final class ApiVersionService private (implicit
}

private[apiserver] object ApiVersionService {
def create()(implicit loggingContext: LoggingContext, ec: ExecutionContext): ApiVersionService =
new ApiVersionService
def create(
errorCodesVersionSwitcher: ErrorCodesVersionSwitcher
)(implicit loggingContext: LoggingContext, ec: ExecutionContext): ApiVersionService =
new ApiVersionService(errorCodesVersionSwitcher)
}

0 comments on commit 443b64d

Please sign in to comment.