View Issue Details

IDProjectCategoryView StatusLast Update
0006729Talerdocumentationpublic2021-08-24 16:23
ReporterLUG Assigned Tottn  
PrioritynormalSeveritytextReproducibilityN/A
Status closedResolutionfixed 
Summary0006729: Hackathon LibEuFin setup experience
DescriptionThis 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>
TagsNo tags attached.

Relationships

child of 0006695 closedttn review/edit the LibEuFin How-To 

Activities

LUG

2021-01-30 14:07

reporter   ~0017460

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.

ttn

2021-01-30 14:16

developer   ~0017463

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.

LUG

2021-01-30 14:58

reporter   ~0017467

The attached files moved to https://git.taler.net/libeufin-deployment.git/tree/docker

Florian Dold

2021-01-30 15:06

manager   ~0017468

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.

LUG

2021-01-30 15:12

reporter   ~0017469

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!

LUG

2021-01-30 17:19

reporter   ~0017470

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

ttn

2021-02-03 00:29

developer   ~0017493

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.

ttn

2021-08-10 20:39

developer   ~0018091

With the recent changes (https://bugs.gnunet.org/view.php?id=6695),
this can be closed now.

Issue History

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