View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0006729 | Taler | documentation | public | 2021-01-30 14:05 | 2021-08-24 16:23 |
Reporter | LUG | Assigned To | ttn | ||
Priority | normal | Severity | text | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Summary | 0006729: Hackathon LibEuFin setup experience | ||||
Description | This is a summary of my experience, installing and running the LibEuFin components in Docker containers as part of the GNU Taler hackathon on 2021-01-30. As an attachment, I provide the Dockerfiles and setup instructions that are referenced in the observations below. Should I get to it, I'll work with ms or florian.d to integrate a Docker setup into an appropriate repo and CI/CD. But my main focus is to give feedback on the experience and clarify open questions. ==== Dependencies ==== The docs says to set ''/etc/apt/preferences''; could it be a better practice to set ''/etc/apt/preferences.d/99libeufin'' instead? It seem there might be a similar logic for ''sourceslist.d/'' as well, to avoid modifying the main ''sourceslist'' and make the libfints additions a bit more transparent. ==== Nexus ==== === Database === Section 15.11.3 of the Nexus documentation says <code> This sets up the PostgreSQL database to listen on port 5433, for internal communication with the nexus service. The nexus service itself listens on port 5001. </code> Does ''libeufin-nexus serve'' set up that DB or do I need to set it up? Assumption: It seems like it's starting a postgres DB for me, at least the startup is not failing if no DB is present at connection specified via the environment variable. If that's correct: * Where is the data persisted? * How do I manage & scale that DB? * Is this intended for production? * If it's just a convenience feature for quick try out, how can I bring my own DB? === Setting a super user password as env var or argument === I don't seem to be able to find out from the ''libeufin-nexus'' command whether I can do something other than interactively provide a password to ''libeufin-nexus superuser'' <code> root@86c2628532b4:/# man libeufin-nexus No manual entry for libeufin-nexus </code> For programmatic deployments, I'd like to be able to provide the password via a CLI arg to ''libeufin-nexus superuser'' or alternatively via and environment variable. ==== Sandbox ==== === Internal Server Error ''generate-transactions'' === Following "Scenario 1" described in the attached README: <code> root@c9542bf6fc0c:/# export LIBEUFIN_SANDBOX_URL=http://172.17.0.1:5000/ root@c9542bf6fc0c:/# libeufin-cli sandbox check { "name" : "libeufin-sandbox", "version" : "0.0.0-dev.0" } root@c9542bf6fc0c:/# libeufin-cli sandbox ebicshost create --host-id testhost root@c9542bf6fc0c:/# libeufin-cli sandbox ebicssubscriber create \ --host-id testhost --partner-id partner01 --user-id user01 root@c9542bf6fc0c:/# libeufin-cli sandbox ebicsbankaccount create \ --currency EUR \ --iban DE18500105172929531888 \ --bic INGDDEFFXXX \ --person-name "Jane Normal" \ --account-name "testacct01" \ --ebics-host-id testhost \ --ebics-user-id user01 \ --ebics-partner-id partner01 root@c9542bf6fc0c:/# libeufin-cli sandbox bankaccount generate-transactions testacct01 Internal server error. </code> With the log output on the server being: <code> 1:59:12.482 [main] INFO tech.libeufin.sandbox - LibEuFin Sandbox running on port 5000 11:59:12.612 [main] DEBUG tech.libeufin.sandbox - Application started: io.ktor.application.Application@7a24eb3 11:59:54.063 [eventLoopGroupProxy-4-1] DEBUG tech.libeufin.sandbox - 200 OK: GET - /config 12:00:21.809 [eventLoopGroupProxy-4-2] DEBUG tech.libeufin.sandbox - 200 OK: GET - /config 12:00:41.335 [eventLoopGroupProxy-4-3] DEBUG tech.libeufin.sandbox - 200 OK: POST - /admin/ebics/hosts 12:00:46.340 [eventLoopGroupProxy-4-4] DEBUG tech.libeufin.sandbox - 200 OK: POST - /admin/ebics/subscribers 12:00:50.729 [eventLoopGroupProxy-4-5] DEBUG tech.libeufin.sandbox - 200 OK: POST - /admin/ebics/bank-accounts 12:00:54.948 [eventLoopGroupProxy-4-6] WARN Exposed - Transaction attempt #0 failed: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference). Statement(s): INSERT INTO BankAccountTransactions (account, amount, creditorBic, creditorIban, creditorName, currency, "date", debtorBic, debtorIban, debtorName, direction, pmtInfId, subject) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) org.jetbrains.exposed.exceptions.ExposedSQLException: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:63) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:126) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:112) at org.jetbrains.exposed.sql.statements.Statement.execute(Statement.kt:29) at org.jetbrains.exposed.sql.QueriesKt.insert(Queries.kt:73) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt:443) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:170) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:211) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:210) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:148) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:120) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:118) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:117) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invokeSuspend(Main.kt:435) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invoke(Main.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.routing.Routing.executeResult(Routing.kt:155) at io.ktor.routing.Routing.interceptor(Routing.kt:39) at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:107) at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:110) at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:102) at io.ktor.features.StatusPages$interceptCall$2.invoke(StatusPages.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:194) at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:101) at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:142) at io.ktor.features.StatusPages$Feature$install$2.invoke(StatusPages.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139) at io.ktor.features.CallLogging$Feature$install$2.invoke(CallLogging.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:124) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:122) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55) at kotlinx.coroutines.BuildersKt__Builders_commonKt.startCoroutineImpl(Builders.common.kt:194) at kotlinx.coroutines.BuildersKt.startCoroutineImpl(Unknown Source) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:145) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at io.ktor.server.netty.NettyApplicationCallHandler.handleRequest(NettyApplicationCallHandler.kt:43) at io.ktor.server.netty.NettyApplicationCallHandler.channelRead(NettyApplicationCallHandler.kt:34) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61) at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:370) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.ktor.server.netty.EventLoopGroupProxy$Companion$create$factory$1$1.run(NettyApplicationEngine.kt:227) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.sqlite.core.DB.newSQLException(DB.java:941) at org.sqlite.core.DB.newSQLException(DB.java:953) at org.sqlite.core.DB.execute(DB.java:854) at org.sqlite.core.DB.executeUpdate(DB.java:895) at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:102) at org.jetbrains.exposed.sql.statements.jdbc.JdbcPreparedStatementImpl.executeUpdate(JdbcPreparedStatementImpl.kt:23) at org.jetbrains.exposed.sql.statements.InsertStatement.execInsertFunction(InsertStatement.kt:109) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:115) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:14) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:61) ... 73 common frames omitted 12:00:54.952 [eventLoopGroupProxy-4-6] WARN Exposed - Transaction attempt #1 failed: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference). Statement(s): INSERT INTO BankAccountTransactions (account, amount, creditorBic, creditorIban, creditorName, currency, "date", debtorBic, debtorIban, debtorName, direction, pmtInfId, subject) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) org.jetbrains.exposed.exceptions.ExposedSQLException: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:63) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:126) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:112) at org.jetbrains.exposed.sql.statements.Statement.execute(Statement.kt:29) at org.jetbrains.exposed.sql.QueriesKt.insert(Queries.kt:73) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt:443) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:170) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:211) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:210) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:148) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:120) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:118) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:117) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invokeSuspend(Main.kt:435) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invoke(Main.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.routing.Routing.executeResult(Routing.kt:155) at io.ktor.routing.Routing.interceptor(Routing.kt:39) at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:107) at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:110) at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:102) at io.ktor.features.StatusPages$interceptCall$2.invoke(StatusPages.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:194) at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:101) at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:142) at io.ktor.features.StatusPages$Feature$install$2.invoke(StatusPages.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139) at io.ktor.features.CallLogging$Feature$install$2.invoke(CallLogging.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:124) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:122) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55) at kotlinx.coroutines.BuildersKt__Builders_commonKt.startCoroutineImpl(Builders.common.kt:194) at kotlinx.coroutines.BuildersKt.startCoroutineImpl(Unknown Source) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:145) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at io.ktor.server.netty.NettyApplicationCallHandler.handleRequest(NettyApplicationCallHandler.kt:43) at io.ktor.server.netty.NettyApplicationCallHandler.channelRead(NettyApplicationCallHandler.kt:34) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61) at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:370) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.ktor.server.netty.EventLoopGroupProxy$Companion$create$factory$1$1.run(NettyApplicationEngine.kt:227) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.sqlite.core.DB.newSQLException(DB.java:941) at org.sqlite.core.DB.newSQLException(DB.java:953) at org.sqlite.core.DB.execute(DB.java:854) at org.sqlite.core.DB.executeUpdate(DB.java:895) at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:102) at org.jetbrains.exposed.sql.statements.jdbc.JdbcPreparedStatementImpl.executeUpdate(JdbcPreparedStatementImpl.kt:23) at org.jetbrains.exposed.sql.statements.InsertStatement.execInsertFunction(InsertStatement.kt:109) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:115) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:14) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:61) ... 73 common frames omitted 12:00:54.954 [eventLoopGroupProxy-4-6] WARN Exposed - Transaction attempt #2 failed: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference). Statement(s): INSERT INTO BankAccountTransactions (account, amount, creditorBic, creditorIban, creditorName, currency, "date", debtorBic, debtorIban, debtorName, direction, pmtInfId, subject) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) org.jetbrains.exposed.exceptions.ExposedSQLException: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:63) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:126) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:112) at org.jetbrains.exposed.sql.statements.Statement.execute(Statement.kt:29) at org.jetbrains.exposed.sql.QueriesKt.insert(Queries.kt:73) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt:443) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:170) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:211) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:210) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:148) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:120) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:118) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:117) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invokeSuspend(Main.kt:435) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invoke(Main.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.routing.Routing.executeResult(Routing.kt:155) at io.ktor.routing.Routing.interceptor(Routing.kt:39) at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:107) at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:110) at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:102) at io.ktor.features.StatusPages$interceptCall$2.invoke(StatusPages.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:194) at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:101) at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:142) at io.ktor.features.StatusPages$Feature$install$2.invoke(StatusPages.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139) at io.ktor.features.CallLogging$Feature$install$2.invoke(CallLogging.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:124) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:122) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55) at kotlinx.coroutines.BuildersKt__Builders_commonKt.startCoroutineImpl(Builders.common.kt:194) at kotlinx.coroutines.BuildersKt.startCoroutineImpl(Unknown Source) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:145) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at io.ktor.server.netty.NettyApplicationCallHandler.handleRequest(NettyApplicationCallHandler.kt:43) at io.ktor.server.netty.NettyApplicationCallHandler.channelRead(NettyApplicationCallHandler.kt:34) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61) at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:370) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.ktor.server.netty.EventLoopGroupProxy$Companion$create$factory$1$1.run(NettyApplicationEngine.kt:227) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.sqlite.core.DB.newSQLException(DB.java:941) at org.sqlite.core.DB.newSQLException(DB.java:953) at org.sqlite.core.DB.execute(DB.java:854) at org.sqlite.core.DB.executeUpdate(DB.java:895) at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:102) at org.jetbrains.exposed.sql.statements.jdbc.JdbcPreparedStatementImpl.executeUpdate(JdbcPreparedStatementImpl.kt:23) at org.jetbrains.exposed.sql.statements.InsertStatement.execInsertFunction(InsertStatement.kt:109) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:115) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:14) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:61) ... 73 common frames omitted 12:00:54.956 [eventLoopGroupProxy-4-6] ERROR tech.libeufin.sandbox - Exception while handling '/admin/bank-accounts/testacct01/generate-transactions' org.jetbrains.exposed.exceptions.ExposedSQLException: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:63) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:126) at org.jetbrains.exposed.sql.Transaction.exec(Transaction.kt:112) at org.jetbrains.exposed.sql.statements.Statement.execute(Statement.kt:29) at org.jetbrains.exposed.sql.QueriesKt.insert(Queries.kt:73) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt:443) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9$1.invoke(Main.kt) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$1.invoke(ThreadLocalTransactionManager.kt:170) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$inTopLevelTransaction$2.invoke(ThreadLocalTransactionManager.kt:211) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.inTopLevelTransaction(ThreadLocalTransactionManager.kt:210) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt$transaction$1.invoke(ThreadLocalTransactionManager.kt:148) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.keepAndRestoreTransactionRefAfterRun(ThreadLocalTransactionManager.kt:219) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:120) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction(ThreadLocalTransactionManager.kt:118) at org.jetbrains.exposed.sql.transactions.ThreadLocalTransactionManagerKt.transaction$default(ThreadLocalTransactionManager.kt:117) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invokeSuspend(Main.kt:435) at tech.libeufin.sandbox.MainKt$serverMain$server$1$5$9.invoke(Main.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.routing.Routing.executeResult(Routing.kt:155) at io.ktor.routing.Routing.interceptor(Routing.kt:39) at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:107) at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:110) at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.StatusPages$interceptCall$2.invokeSuspend(StatusPages.kt:102) at io.ktor.features.StatusPages$interceptCall$2.invoke(StatusPages.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:91) at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:194) at io.ktor.features.StatusPages.interceptCall(StatusPages.kt:101) at io.ktor.features.StatusPages$Feature$install$2.invokeSuspend(StatusPages.kt:142) at io.ktor.features.StatusPages$Feature$install$2.invoke(StatusPages.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.features.CallLogging$Feature$install$2.invokeSuspend(CallLogging.kt:139) at io.ktor.features.CallLogging$Feature$install$2.invoke(CallLogging.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:124) at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt) at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243) at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113) at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133) at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:79) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:122) at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt) at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55) at kotlinx.coroutines.BuildersKt__Builders_commonKt.startCoroutineImpl(Builders.common.kt:194) at kotlinx.coroutines.BuildersKt.startCoroutineImpl(Unknown Source) at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:145) at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56) at kotlinx.coroutines.BuildersKt.launch(Unknown Source) at io.ktor.server.netty.NettyApplicationCallHandler.handleRequest(NettyApplicationCallHandler.kt:43) at io.ktor.server.netty.NettyApplicationCallHandler.channelRead(NettyApplicationCallHandler.kt:34) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61) at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:370) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.ktor.server.netty.EventLoopGroupProxy$Companion$create$factory$1$1.run(NettyApplicationEngine.kt:227) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.base/java.lang.Thread.run(Thread.java:834) Caused by: org.sqlite.SQLiteException: [SQLITE_CONSTRAINT] Abort due to constraint violation (NOT NULL constraint failed: BankAccountTransactions.accountServicerReference) at org.sqlite.core.DB.newSQLException(DB.java:941) at org.sqlite.core.DB.newSQLException(DB.java:953) at org.sqlite.core.DB.execute(DB.java:854) at org.sqlite.core.DB.executeUpdate(DB.java:895) at org.sqlite.jdbc3.JDBC3PreparedStatement.executeUpdate(JDBC3PreparedStatement.java:102) at org.jetbrains.exposed.sql.statements.jdbc.JdbcPreparedStatementImpl.executeUpdate(JdbcPreparedStatementImpl.kt:23) at org.jetbrains.exposed.sql.statements.InsertStatement.execInsertFunction(InsertStatement.kt:109) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:115) at org.jetbrains.exposed.sql.statements.InsertStatement.executeInternal(InsertStatement.kt:14) at org.jetbrains.exposed.sql.statements.Statement.executeIn$exposed_core(Statement.kt:61) ... 73 common frames omitted 12:00:54.956 [eventLoopGroupProxy-4-6] DEBUG tech.libeufin.sandbox - 500 Internal Server Error: POST - /admin/bank-accounts/testacct01/generate-transactions </code> | ||||
Tags | No tags attached. | ||||
|
Apologies, I just noticed that the formatting documentation I found for mantis only applies to the Mantis Wiki. Is there a way to format text on this Mantis instance? I feel like this could help readability. I'd be happy to adjust the original text above to an appropriate formatting markup language. |
|
No worries. I don't know of a way to format things in Mantis proper, despite searching the Net multiple times. I think we just have to live w/ it. In the end, it's more important that info be captured than the formatting anyway. |
|
The attached files moved to https://git.taler.net/libeufin-deployment.git/tree/docker |
|
The sandbox issue should now be addressed in Git, but the Debian package hasn't been updated yet. Some other comments: * The password can indeed be specified interactively on the command line, it just prompts when it is not specified. I guess we could mention that in the documentation. * The "serve" commands create required tables if they don't exist yet. It doesn't start postgres. But it might actually be a better idea to move the initialization of the database to a different command ("libeufin-nexus dbinit" or something similar). * Based on your feedback, the documentation should probably explain better how the DB is used and what it's needed for. * LibEuFin should complain when no DB connection string has been given. Using some SQLite database as a fallback is IMHO confusing. |
|
Thanks Florian, this already helps me understand better what's going on and the proposed docs improvements should help others as well. Also appreciate the swift fix, thanks! |
|
We have the basic sandbox cli interaction from the docs as a test in a docker compose setup now (Scenario 1 in https://git.taler.net/libeufin-deployment.git/tree/docker/README.md). Two things that come to mind as potential follow ups: * Make the libeufin-cli return 1 as an exit code on erroneous interactions with the API, see example below returning a successful 0. * Add the docker compose build and up as a test to buildbot (requires docker and docker-compose runtime on the build agents). Example for "Internal server error." still resulting in a successful exit of the CLI: Attaching to docker_libeufin-sandbox-cli_1 libeufin-sandbox-cli_1 | { libeufin-sandbox-cli_1 | "name" : "libeufin-sandbox", libeufin-sandbox-cli_1 | "version" : "0.0.0-dev.0" libeufin-sandbox-cli_1 | } libeufin-sandbox-cli_1 | Internal server error. libeufin-sandbox-cli_1 | Internal server error. libeufin-sandbox-cli_1 | { libeufin-sandbox-cli_1 | "payments" : [ ] libeufin-sandbox-cli_1 | } docker_libeufin-sandbox-cli_1 exited with code 0 |
|
Re "no complaint when not given a db conn string" -- i thought that's how it's supposed to work. IOW, the db connection string is specified via env vars solely, and no longer via command-line option. What am i missing? Adding MS to the issue. |
|
With the recent changes (https://bugs.gnunet.org/view.php?id=6695), this can be closed now. |
Date Modified | Username | Field | Change |
---|---|---|---|
2021-01-30 14:05 | LUG | New Issue | |
2021-01-30 14:05 | LUG | Status | new => assigned |
2021-01-30 14:05 | LUG | Assigned To | => ttn |
2021-01-30 14:05 | LUG | File Added: apt_preferences | |
2021-01-30 14:05 | LUG | File Added: libeufin.Dockerfile | |
2021-01-30 14:05 | LUG | File Added: nexus.Dockerfile | |
2021-01-30 14:05 | LUG | File Added: README.md | |
2021-01-30 14:05 | LUG | File Added: sandbox.Dockerfile | |
2021-01-30 14:07 | LUG | Note Added: 0017460 | |
2021-01-30 14:10 | LUG | Description Updated | |
2021-01-30 14:16 | ttn | Note Added: 0017463 | |
2021-01-30 14:57 | ttn | Relationship added | child of 0006695 |
2021-01-30 14:58 | LUG | File Deleted: apt_preferences | |
2021-01-30 14:58 | LUG | File Deleted: libeufin.Dockerfile | |
2021-01-30 14:58 | LUG | File Deleted: nexus.Dockerfile | |
2021-01-30 14:58 | LUG | File Deleted: README.md | |
2021-01-30 14:58 | LUG | File Deleted: sandbox.Dockerfile | |
2021-01-30 14:58 | LUG | Note Added: 0017467 | |
2021-01-30 15:06 | Florian Dold | Note Added: 0017468 | |
2021-01-30 15:12 | LUG | Note Added: 0017469 | |
2021-01-30 17:19 | LUG | Note Added: 0017470 | |
2021-01-30 23:55 | Christian Grothoff | Severity | minor => text |
2021-02-03 00:29 | ttn | Note Added: 0017493 | |
2021-06-02 09:57 | Christian Grothoff | Assigned To | ttn => Florian Dold |
2021-08-10 20:36 | ttn | Assigned To | Florian Dold => ttn |
2021-08-10 20:39 | ttn | Status | assigned => resolved |
2021-08-10 20:39 | ttn | Resolution | open => fixed |
2021-08-10 20:39 | ttn | Note Added: 0018091 | |
2021-08-24 16:23 | Christian Grothoff | Status | resolved => closed |