[DPP-646][Self-service error codes] Adopt ApiPackageManagementService (#11314)

CHANGELOG_BEGIN
CHANGELOG_END
This commit is contained in:
pbatko-da 2021-10-25 12:11:15 +02:00 committed by GitHub
parent 0ee59f57c9
commit 79037c8855
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 6 deletions

View File

@ -46,6 +46,20 @@ object LedgerApiErrors extends LedgerApiErrorGroup {
cause = message cause = message
) )
} }
@Explanation("This rejection is given when a package upload was rejected.")
@Resolution("Refer to the detailed message of the received error.")
object PackageUploadRejected
extends ErrorCode(
id = "PACKAGE_UPLOAD_REJECTED",
ErrorCategory.InvalidGivenCurrentSystemStateOther,
) {
case class Reject(message: String)(implicit
loggingContext: ContextualizedErrorLogger
) extends LoggingTransactionErrorImpl(
cause = message
)
}
} }
object ReadErrors extends ErrorGroup() { object ReadErrors extends ErrorGroup() {

View File

@ -269,6 +269,15 @@ class ErrorFactories private (errorCodesVersionSwitcher: ErrorCodesVersionSwitch
grpcError(statusBuilder.build()) grpcError(statusBuilder.build())
} }
def packageUploadRejected(message: String, definiteAnswer: Option[Boolean])(implicit
contextualizedErrorLogger: ContextualizedErrorLogger
): StatusRuntimeException = {
errorCodesVersionSwitcher.choose(
v1 = invalidArgumentV1(definiteAnswer, message),
v2 = LedgerApiErrors.WriteErrors.PackageUploadRejected.Reject(message).asGrpcError,
)
}
def configurationEntryRejected(message: String, definiteAnswer: Option[Boolean])(implicit def configurationEntryRejected(message: String, definiteAnswer: Option[Boolean])(implicit
contextualizedErrorLogger: ContextualizedErrorLogger contextualizedErrorLogger: ContextualizedErrorLogger
): StatusRuntimeException = { ): StatusRuntimeException = {

View File

@ -284,6 +284,7 @@ private[daml] object ApiServices {
writeService, writeService,
managementServiceTimeout, managementServiceTimeout,
engine, engine,
errorsVersionsSwitcher,
) )
val apiConfigManagementService = ApiConfigManagementService.createApiService( val apiConfigManagementService = ApiConfigManagementService.createApiService(

View File

@ -8,7 +8,11 @@ import java.util.zip.ZipInputStream
import akka.stream.Materializer import akka.stream.Materializer
import akka.stream.scaladsl.Source import akka.stream.scaladsl.Source
import com.daml.daml_lf_dev.DamlLf.Archive import com.daml.daml_lf_dev.DamlLf.Archive
import com.daml.error.{DamlContextualizedErrorLogger, ContextualizedErrorLogger} import com.daml.error.{
ContextualizedErrorLogger,
DamlContextualizedErrorLogger,
ErrorCodesVersionSwitcher,
}
import com.daml.ledger.api.domain.{LedgerOffset, PackageEntry} import com.daml.ledger.api.domain.{LedgerOffset, PackageEntry}
import com.daml.ledger.api.v1.admin.package_management_service.PackageManagementServiceGrpc.PackageManagementService import com.daml.ledger.api.v1.admin.package_management_service.PackageManagementServiceGrpc.PackageManagementService
import com.daml.ledger.api.v1.admin.package_management_service._ import com.daml.ledger.api.v1.admin.package_management_service._
@ -47,6 +51,7 @@ private[apiserver] final class ApiPackageManagementService private (
engine: Engine, engine: Engine,
darReader: GenDarReader[Archive], darReader: GenDarReader[Archive],
submissionIdGenerator: String => Ref.SubmissionId, submissionIdGenerator: String => Ref.SubmissionId,
errorCodesVersionSwitcher: ErrorCodesVersionSwitcher,
)(implicit )(implicit
materializer: Materializer, materializer: Materializer,
executionContext: ExecutionContext, executionContext: ExecutionContext,
@ -58,11 +63,14 @@ private[apiserver] final class ApiPackageManagementService private (
private implicit val contextualizedErrorLogger: ContextualizedErrorLogger = private implicit val contextualizedErrorLogger: ContextualizedErrorLogger =
new DamlContextualizedErrorLogger(logger, loggingContext, None) new DamlContextualizedErrorLogger(logger, loggingContext, None)
private val errorFactories = ErrorFactories(errorCodesVersionSwitcher)
private val synchronousResponse = new SynchronousResponse( private val synchronousResponse = new SynchronousResponse(
new SynchronousResponseStrategy( new SynchronousResponseStrategy(
transactionsService, transactionsService,
packagesIndex, packagesIndex,
packagesWrite, packagesWrite,
errorFactories,
), ),
timeToLive = managementServiceTimeout, timeToLive = managementServiceTimeout,
) )
@ -120,7 +128,7 @@ private[apiserver] final class ApiPackageManagementService private (
ValidationLogger ValidationLogger
.logFailureWithContext( .logFailureWithContext(
request, request,
ErrorFactories.invalidArgument(None)(err.getMessage), errorFactories.invalidArgument(None)(err.getMessage),
) )
), ),
Future.successful, Future.successful,
@ -146,6 +154,7 @@ private[apiserver] object ApiPackageManagementService {
writeBackend: state.WritePackagesService, writeBackend: state.WritePackagesService,
managementServiceTimeout: Duration, managementServiceTimeout: Duration,
engine: Engine, engine: Engine,
errorCodesVersionSwitcher: ErrorCodesVersionSwitcher,
darReader: GenDarReader[Archive] = DarParser, darReader: GenDarReader[Archive] = DarParser,
submissionIdGenerator: String => Ref.SubmissionId = augmentSubmissionId, submissionIdGenerator: String => Ref.SubmissionId = augmentSubmissionId,
)(implicit )(implicit
@ -161,12 +170,14 @@ private[apiserver] object ApiPackageManagementService {
engine, engine,
darReader, darReader,
submissionIdGenerator, submissionIdGenerator,
errorCodesVersionSwitcher,
) )
private final class SynchronousResponseStrategy( private final class SynchronousResponseStrategy(
ledgerEndService: LedgerEndService, ledgerEndService: LedgerEndService,
packagesIndex: IndexPackagesService, packagesIndex: IndexPackagesService,
packagesWrite: state.WritePackagesService, packagesWrite: state.WritePackagesService,
errorFactories: ErrorFactories,
)(implicit executionContext: ExecutionContext, loggingContext: LoggingContext) )(implicit executionContext: ExecutionContext, loggingContext: LoggingContext)
extends SynchronousResponse.Strategy[ extends SynchronousResponse.Strategy[
Dar[Archive], Dar[Archive],
@ -198,7 +209,7 @@ private[apiserver] object ApiPackageManagementService {
submissionId: Ref.SubmissionId submissionId: Ref.SubmissionId
): PartialFunction[PackageEntry, StatusRuntimeException] = { ): PartialFunction[PackageEntry, StatusRuntimeException] = {
case PackageEntry.PackageUploadRejected(`submissionId`, _, reason) => case PackageEntry.PackageUploadRejected(`submissionId`, _, reason) =>
ErrorFactories.invalidArgument(None)(reason) errorFactories.packageUploadRejected(reason, definiteAnswer = None)
} }
} }

View File

@ -6,10 +6,10 @@ package com.daml.platform.apiserver.services.admin
import java.time.{Duration, Instant} import java.time.{Duration, Instant}
import java.util.concurrent.{CompletableFuture, CompletionStage} import java.util.concurrent.{CompletableFuture, CompletionStage}
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
import akka.stream.scaladsl.Source import akka.stream.scaladsl.Source
import com.daml.daml_lf_dev.DamlLf import com.daml.daml_lf_dev.DamlLf
import com.daml.daml_lf_dev.DamlLf.Archive import com.daml.daml_lf_dev.DamlLf.Archive
import com.daml.error.ErrorCodesVersionSwitcher
import com.daml.ledger.api.domain.LedgerOffset.Absolute import com.daml.ledger.api.domain.LedgerOffset.Absolute
import com.daml.ledger.api.domain.PackageEntry import com.daml.ledger.api.domain.PackageEntry
import com.daml.ledger.api.testing.utils.AkkaBeforeAndAfterAll import com.daml.ledger.api.testing.utils.AkkaBeforeAndAfterAll
@ -49,7 +49,9 @@ class ApiPackageManagementServiceSpec
private implicit val loggingContext: LoggingContext = LoggingContext.ForTesting private implicit val loggingContext: LoggingContext = LoggingContext.ForTesting
"ApiPackageManagementService" should { val errorCodesVersionSwitcher = mock[ErrorCodesVersionSwitcher]
"ApiPackageManagementService $suffix" should {
"propagate trace context" in { "propagate trace context" in {
val apiService = createApiService() val apiService = createApiService()
@ -63,11 +65,13 @@ class ApiPackageManagementServiceSpec
} }
.map { _ => .map { _ =>
spanExporter.finishedSpanAttributes should contain(anApplicationIdSpanAttribute) spanExporter.finishedSpanAttributes should contain(anApplicationIdSpanAttribute)
verifyZeroInteractions(errorCodesVersionSwitcher)
succeed
} }
} }
} }
private def createApiService(): PackageManagementServiceGrpc.PackageManagementService = { def createApiService(): PackageManagementServiceGrpc.PackageManagementService = {
val mockDarReader = mock[GenDarReader[Archive]] val mockDarReader = mock[GenDarReader[Archive]]
when(mockDarReader.readArchive(any[String], any[ZipInputStream], any[Int])) when(mockDarReader.readArchive(any[String], any[ZipInputStream], any[Int]))
.thenReturn(Right(new Dar[Archive](anArchive, List.empty))) .thenReturn(Right(new Dar[Archive](anArchive, List.empty)))
@ -95,6 +99,7 @@ class ApiPackageManagementServiceSpec
TestWritePackagesService, TestWritePackagesService,
Duration.ZERO, Duration.ZERO,
mockEngine, mockEngine,
errorCodesVersionSwitcher,
mockDarReader, mockDarReader,
_ => Ref.SubmissionId.assertFromString("aSubmission"), _ => Ref.SubmissionId.assertFromString("aSubmission"),
) )