From 501b84bea5fc3f47a2d5552d101bac983f2f03e2 Mon Sep 17 00:00:00 2001 From: John Ahlroos Date: Wed, 6 Jun 2018 20:36:27 +0300 Subject: [PATCH] Fixed docker networking --- .../groovy/com/devsoap/dbt/DBTModule.groovy | 3 +- .../dbt/actions/ExecutorChainAction.groovy | 3 ++ .../dbt/actions/LedgerChainAction.groovy | 2 + .../dbt/handlers/ConfigInfoHandler.groovy | 28 +++++++++++++ .../dbt/handlers/ExecutorHandler.groovy | 22 +++++++--- .../LedgerUpdateTransactionHandler.groovy | 42 ++++++++++++++----- docker-compose.yml | 19 +++++++-- 7 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ConfigInfoHandler.groovy diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/DBTModule.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/DBTModule.groovy index 6079c20..29c542d 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/DBTModule.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/DBTModule.groovy @@ -20,6 +20,7 @@ import com.devsoap.dbt.actions.LedgerChainAction import com.devsoap.dbt.config.DBTConfig import com.devsoap.dbt.data.LedgerData import com.devsoap.dbt.handlers.ExecutorHandler +import com.devsoap.dbt.handlers.ConfigInfoHandler import com.devsoap.dbt.handlers.LedgerGetTransactionHandler import com.devsoap.dbt.handlers.LedgerListTransactionsHandler import com.devsoap.dbt.handlers.LedgerUpdateTransactionHandler @@ -27,7 +28,6 @@ import com.devsoap.dbt.services.LedgerService import com.devsoap.dbt.services.TransactionManagerService import com.fasterxml.jackson.databind.ObjectMapper import com.google.inject.multibindings.Multibinder -import groovy.json.JsonBuilder import groovy.util.logging.Slf4j import ratpack.guice.ConfigurableModule import ratpack.handling.HandlerDecorator @@ -47,6 +47,7 @@ class DBTModule extends ConfigurableModule { bind(ExecutorChainAction) bind(ExecutorHandler) + bind(ConfigInfoHandler) bind(LedgerData) bind(LedgerService) diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/actions/ExecutorChainAction.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/actions/ExecutorChainAction.groovy index 1e734a9..0d24418 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/actions/ExecutorChainAction.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/actions/ExecutorChainAction.groovy @@ -17,9 +17,11 @@ package com.devsoap.dbt.actions import com.devsoap.dbt.config.DBTConfig import com.devsoap.dbt.handlers.ExecutorHandler +import com.devsoap.dbt.handlers.ConfigInfoHandler import com.google.inject.Inject import groovy.util.logging.Slf4j import ratpack.groovy.handling.GroovyChainAction +import ratpack.handling.Handlers @Slf4j class ExecutorChainAction extends GroovyChainAction { @@ -39,5 +41,6 @@ class ExecutorChainAction extends GroovyChainAction { log.info("Registering executor at /$executorPath") path(executorPath, ExecutorHandler) + path("$executorPath/config", ConfigInfoHandler) } } diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/actions/LedgerChainAction.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/actions/LedgerChainAction.groovy index e3cbadb..b914609 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/actions/LedgerChainAction.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/actions/LedgerChainAction.groovy @@ -16,6 +16,7 @@ package com.devsoap.dbt.actions import com.devsoap.dbt.config.DBTConfig +import com.devsoap.dbt.handlers.ConfigInfoHandler import com.devsoap.dbt.handlers.LedgerGetTransactionHandler import com.devsoap.dbt.handlers.LedgerListTransactionsHandler import com.devsoap.dbt.handlers.LedgerUpdateTransactionHandler @@ -46,5 +47,6 @@ class LedgerChainAction extends GroovyChainAction { registry.get(LedgerUpdateTransactionHandler), registry.get(LedgerListTransactionsHandler) )) + path("$ledgerPath/config", ConfigInfoHandler) } } diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ConfigInfoHandler.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ConfigInfoHandler.groovy new file mode 100644 index 0000000..9cd8c78 --- /dev/null +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ConfigInfoHandler.groovy @@ -0,0 +1,28 @@ +package com.devsoap.dbt.handlers + +import com.devsoap.dbt.config.DBTConfig +import ratpack.handling.Context +import ratpack.handling.Handler +import ratpack.http.HttpMethod +import ratpack.jackson.Jackson + +import javax.inject.Inject + +class ConfigInfoHandler implements Handler { + + private final DBTConfig config + + @Inject + ConfigInfoHandler(DBTConfig config) { + this.config = config + } + + @Override + void handle(Context ctx) throws Exception { + if(ctx.request.method == HttpMethod.GET) { + ctx.render Jackson.json(config) + } else { + ctx.next() + } + } +} diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy index 9550394..f9707f3 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/ExecutorHandler.groovy @@ -53,25 +53,35 @@ class ExecutorHandler implements Handler { def ds = ctx.get(DataSource) def transaction = mapper.readValue(body.text, BlockTransaction) + log.info('Recieved transaction {} for execution', transaction.id) + if(!validateChain(transaction)) { - ctx.response.status(Status.of(400, 'Transaction chain invalid')) + log.error("Transaction chain validation failed for transaction {}", transaction.id) + ctx.response.status(Status.of(400, 'Transaction chain invalid')).send() return } + log.info('Executing transaction {} on {}', transaction.id, ds) executeCommands(ds, transaction).onError { e -> log.info("Sending rolled back transaction to ledger") - println mapper.writeValueAsString(transaction) client.post(config.ledger.remoteUrl.toURI(), { spec -> spec.body.text(mapper.writeValueAsString(transaction)) - }).then { - ctx.error(e) + }).onError { ee -> + log.error('Failed to reach ledger', ee) + ctx.response.status(Status.of(404, 'Ledger not found')).send() + }.then { + log.error('Transaction {} rolled back', transaction.id) + ctx.response.status(Status.of(505, 'Transaction rollback')).send() } }.then { log.info("Updating ledger with execution result") client.post(config.ledger.remoteUrl.toURI(), { spec -> spec.body.text(mapper.writeValueAsString(transaction)) - }).then { - ctx.response.send(mapper.writeValueAsString(transaction)) + }).onError { ee -> + log.error('Failed to reach ledger', ee) + ctx.response.status(Status.of(404, 'Ledger not found')).send() + }.then { + ctx.response.send(it.body.text) } } } diff --git a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/LedgerUpdateTransactionHandler.groovy b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/LedgerUpdateTransactionHandler.groovy index 4011d46..dc413cf 100644 --- a/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/LedgerUpdateTransactionHandler.groovy +++ b/dbt-core/src/main/groovy/com/devsoap/dbt/handlers/LedgerUpdateTransactionHandler.groovy @@ -24,6 +24,8 @@ import ratpack.exec.Promise import ratpack.handling.Context import ratpack.handling.Handler import ratpack.http.HttpMethod +import ratpack.http.Status +import ratpack.http.client.HttpClient import ratpack.jackson.Jackson import javax.inject.Inject @@ -32,10 +34,14 @@ import javax.inject.Inject class LedgerUpdateTransactionHandler implements Handler { private final DBTConfig config + private final HttpClient client + private final ObjectMapper mapper @Inject - LedgerUpdateTransactionHandler(DBTConfig config) { + LedgerUpdateTransactionHandler(DBTConfig config, HttpClient client, ObjectMapper mapper) { this.config = config + this.mapper = mapper + this.client = client } @Override @@ -71,11 +77,18 @@ class LedgerUpdateTransactionHandler implements Handler { def transaction = cloneTransaction(oldTransaction, newTransaction) def ledgerService = ctx.get(LedgerService) - ledgerService.updateTransaction(transaction).then { - log.info("Transaction $it updated in ledger") + ledgerService.updateTransaction(transaction).then { id -> + log.info("Transaction $id updated in ledger") if (transaction.completed & !(transaction.executed || transaction.rolledback)) { - log.info("Sending transaction $transaction.id to executor at $config.executor.remoteUrl") - ctx.redirect(config.executor.remoteUrl) + log.info("Sending transaction $id to executor at $config.executor.remoteUrl") + client.post(config.executor.remoteUrl.toURI(), { spec -> + spec.body.text(mapper.writeValueAsString(transaction)) + }).onError { err -> + log.error('Failed to reach executor', err) + ctx.response.status(Status.of(404, 'Executor not found')).send() + }.then { + ctx.response.send(it.body.text) + } } else { ctx.render(Jackson.json(transaction)) } @@ -92,7 +105,14 @@ class LedgerUpdateTransactionHandler implements Handler { log.info("Transaction $it added to ledger") if(transaction.completed){ log.info("Sending transaction $transaction.id to executor at $config.executor.remoteUrl") - ctx.redirect(config.executor.remoteUrl) + client.post(config.executor.remoteUrl.toURI(), { spec -> + spec.body.text(mapper.writeValueAsString(transaction)) + }).onError { err -> + log.error('Failed to reach executor', err) + ctx.response.status(Status.of(404, 'Executor not found')).send() + }.then { + ctx.response.send(it.body.text) + } } else { ctx.render(Jackson.json(transaction)) } @@ -101,14 +121,14 @@ class LedgerUpdateTransactionHandler implements Handler { private static BlockTransaction cloneTransaction(BlockTransaction oldTransaction, BlockTransaction newTransaction) { def transaction = new BlockTransaction() - transaction.id = oldTransaction.id - transaction.executed = oldTransaction.executed - transaction.completed = oldTransaction.completed - transaction.rolledback = oldTransaction.rolledback + transaction.id = newTransaction.id + transaction.executed = newTransaction.executed + transaction.completed = newTransaction.completed + transaction.rolledback = newTransaction.rolledback newTransaction.queries.each { q -> def query = transaction.queries.isEmpty() ? - new BlockTransaction.Query(oldTransaction, q.query) : + new BlockTransaction.Query(transaction, q.query) : new BlockTransaction.Query(transaction.queries.last(), q.query) query.resultError = q.resultError query.result = q.result diff --git a/docker-compose.yml b/docker-compose.yml index 584856b..9ec2c5e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,13 +7,24 @@ services: container_name: dbt-executor environment: - RATPACK_DBT__LEDGER__REMOTE_URL=http://ledger:5050/ledger - ports: - - "5051:5050" + - RATPACK_DEVELOPMENT=false + networks: + dbt: + aliases: + - executor ledger: image: com.devsoap/dbt-ledger container_name: dbt-ledger environment: - - RATPACK_DBT__EXECUTOR__REMOTE_URL=http://executor:5051/executor + - RATPACK_DBT__EXECUTOR__REMOTE_URL=http://executor:5050/executor + - RATPACK_DEVELOPMENT=false ports: - - "5050:5050" \ No newline at end of file + - "5050:5050" + networks: + dbt: + aliases: + - ledger + +networks: + dbt: \ No newline at end of file