mirror of
https://github.com/digital-asset/daml.git
synced 2024-09-20 01:07:18 +03:00
[DPP-646][Self-service error codes] Adopt ApiPackageManagementService (#11314)
CHANGELOG_BEGIN CHANGELOG_END
This commit is contained in:
parent
0ee59f57c9
commit
79037c8855
@ -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() {
|
||||||
|
@ -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 = {
|
||||||
|
@ -284,6 +284,7 @@ private[daml] object ApiServices {
|
|||||||
writeService,
|
writeService,
|
||||||
managementServiceTimeout,
|
managementServiceTimeout,
|
||||||
engine,
|
engine,
|
||||||
|
errorsVersionsSwitcher,
|
||||||
)
|
)
|
||||||
|
|
||||||
val apiConfigManagementService = ApiConfigManagementService.createApiService(
|
val apiConfigManagementService = ApiConfigManagementService.createApiService(
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"),
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user