From 3475138e017aa8bb2576d657d6971fc20857311b Mon Sep 17 00:00:00 2001 From: Kalin Krustev Date: Thu, 20 Jun 2024 16:41:30 +0300 Subject: [PATCH] feat: fx perf tests (#59) --- README.md | 8 + docker-compose-perf.yml | 35 +- .../collections/provisioning/fxp.json | 750 ++++++++++++++++++ .../collections/provisioning/hub_setup.json | 96 +-- .../provisioning/participant_perffsp1.json | 115 ++- .../provisioning/participant_perffsp2.json | 115 ++- .../provisioning/participant_perffsp3.json | 115 ++- .../provisioning/participant_perffsp4.json | 115 ++- .../provisioning/participant_perffsp5.json | 115 ++- .../provisioning/participant_perffsp6.json | 115 ++- .../provisioning/participant_perffsp7.json | 115 ++- .../provisioning/participant_perffsp8.json | 115 ++- .../test-cases/environments/default-env.json | 19 +- .../test-cases/environments/perf-e2e-env.json | 19 +- .../environments/remote-k8s-env.json | 19 +- envs/perffxp.env | 18 + k8s-mojaloop-perf-tuning/patch.sh | 24 +- .../config-k8s/fspiopDFXRampingRate.json | 129 +++ .../k6-tests/config-k8s/fspiopFXQuotes.json | 22 + .../config-k8s/fspiopFXQuotesRampingRate.json | 32 + .../config-k8s/fspiopFXTransfers.json | 22 + .../fspiopFXTransfersRampingRate.json | 32 + .../config-k8s/fspiopQuotesRampingRate.json | 2 +- .../config-k8s/fspiopSingleFXQuote.json | 18 + .../config-k8s/fspiopSingleFXTransfer.json | 18 + packages/k6-tests/index.js | 2 + packages/k6-tests/scenarios/fspiopFXQuotes.js | 6 + .../k6-tests/scenarios/fspiopFXTransfers.js | 6 + packages/k6-tests/scripts/E2E.js | 8 +- packages/k6-tests/scripts/getParties.js | 6 +- .../k6-tests/scripts/getPartiesNoCallback.js | 2 +- .../k6-tests/scripts/inboundSDKGetParties.js | 4 +- packages/k6-tests/scripts/inboundSDKQuotes.js | 4 +- .../k6-tests/scripts/outboundSDKGetParties.js | 2 +- .../k6-tests/scripts/outboundSDKQuotes.js | 4 +- .../k6-tests/scripts/outboundSDKTransfers.js | 4 +- packages/k6-tests/scripts/parallelRequests.js | 6 +- packages/k6-tests/scripts/postFXQuotes.js | 125 +++ packages/k6-tests/scripts/postFXTransfers.js | 141 ++++ packages/k6-tests/scripts/postQuotes.js | 4 +- .../k6-tests/scripts/postQuotesNoCallback.js | 4 +- .../postQuotesPersonalInfoExtensions.js | 4 +- perf-test.sh | 34 +- perf.env | 2 + 44 files changed, 2373 insertions(+), 178 deletions(-) create mode 100644 docker/ml-testing-toolkit/test-cases/collections/provisioning/fxp.json create mode 100644 envs/perffxp.env create mode 100644 packages/k6-tests/config-k8s/fspiopDFXRampingRate.json create mode 100644 packages/k6-tests/config-k8s/fspiopFXQuotes.json create mode 100644 packages/k6-tests/config-k8s/fspiopFXQuotesRampingRate.json create mode 100644 packages/k6-tests/config-k8s/fspiopFXTransfers.json create mode 100644 packages/k6-tests/config-k8s/fspiopFXTransfersRampingRate.json create mode 100644 packages/k6-tests/config-k8s/fspiopSingleFXQuote.json create mode 100644 packages/k6-tests/config-k8s/fspiopSingleFXTransfer.json create mode 100644 packages/k6-tests/scenarios/fspiopFXQuotes.js create mode 100644 packages/k6-tests/scenarios/fspiopFXTransfers.js create mode 100644 packages/k6-tests/scripts/postFXQuotes.js create mode 100644 packages/k6-tests/scripts/postFXTransfers.js diff --git a/README.md b/README.md index d404cc47..1b44ea53 100644 --- a/README.md +++ b/README.md @@ -470,17 +470,25 @@ Then use one of the following commands: - `t discoveries` - Test account discoveries - `t discoveries rate` - Test account discoveries with ramping rates - `t quote` - Test single quote +- `t fx quote` - Test single FX quote - `t quotes` - Test quotes +- `t fx quotes` - Test FX quotes - `t quotes rate` - Test quotes with ramping rates +- `t fx quotes rate` - Test FX quotes with ramping rates - `t transfer` - Test single transfer +- `t fx transfer` - Test single FX transfer - `t transfers` - Test transfers +- `t fx transfers` - Test FX transfers - `t transfers rate` - Test transfers with ramping rates +- `t fx transfers rate` - Test FX transfers with ramping rates - `t dqt rate` - Test account discoveries, quotes and transfers in parallel with constant rates +- `t dfx rate` - Test account discoveries, FX quotes and FX transfers in parallel with constant rates - `t e2e` - Test multiple end to end - `t e2e single` - Test single end to end - `t sim start` - Start the simulators - `t sim stop` - Stop the simulators - `t sim restart` - Restart the simulators +- `t sim update` - Update the simulator images - `p audit` - Configure direct events to Kafka without going through the sidecar, sending only audit and skipping others - `p direct` - Configure direct events to Kafka without going through the sidecar - `p disabled` - Configure no events to be produced diff --git a/docker-compose-perf.yml b/docker-compose-perf.yml index 581841e1..ec7a25ee 100644 --- a/docker-compose-perf.yml +++ b/docker-compose-perf.yml @@ -1,8 +1,7 @@ -version: "3.7" - networks: mojaloop-net: name: mojaloop-net + external: true services: @@ -1000,6 +999,38 @@ services: start_period: 40s interval: 30s + sim-perffxp: + sysctls: + # websockets do not have keep-alive, resulting in many TIME_WAIT sockets + net.ipv4.tcp_tw_reuse: 1 + image: mojaloop/callback-handler-simulator-svc:${TEST_CALLBACK_HAND_SVC_VERSION} + deploy: + mode: replicated + replicas: 1 + env_file: + - .env + - ./envs/perffxp.env + - perf.override.env + ports: + - "25000:3001" + networks: + - mojaloop-net + environment: {} + # - LOG_LEVEL=error + healthcheck: + test: wget -q http://localhost:3001/health -O /dev/null || exit 1 + timeout: 20s + retries: 30 + interval: 15s + user: root + profiles: + - simulators + - all-services + - als-test + - 2dfsp + - 4dfsp + - 8dfsp + sim-perffsp1: sysctls: # websockets do not have keep-alive, resulting in many TIME_WAIT sockets diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/fxp.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/fxp.json new file mode 100644 index 00000000..62c5a87e --- /dev/null +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/fxp.json @@ -0,0 +1,750 @@ +{ + "name": "multi", + "test_cases": [ + { + "id": 1, + "name": "FXP provisioning", + "meta": { + "info": "FXP provisioning" + }, + "requests": [ + { + "id": 1, + "meta": { + "info": "Add participant" + }, + "description": "Add participant", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants", + "path": "/participants", + "method": "post", + "body": { + "name": "perffxp", + "currency": "{$inputs.currency}" + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 400 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(400)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + }, + { + "id": 2, + "meta": { + "info": "Add initial position and limits" + }, + "description": "Add initial position and limits", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/initialPositionAndLimits", + "path": "/participants/perffxp/initialPositionAndLimits", + "method": "post", + "params": { + "name": "perffxp" + }, + "body": { + "currency": "{$inputs.currency}", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 1000000 + }, + "initialPosition": 0 + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 500 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(500)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/perffxp/endpoints", + "method": "post", + "params": { + "name": "perffxp" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FXP_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, + { + "id": 8.1, + "meta": { + "info": "Add callback - FX TRANSFERS POST" + }, + "description": "Add callback - FX TRANSFERS POST", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/perffxp/endpoints", + "method": "post", + "params": { + "name": "perffxp" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_POST", + "value": "{$inputs.PERF_FXP_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, + { + "id": 19, + "meta": { + "info": "Set Endpoint-SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL" + }, + "description": "Set Endpoint-SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/perffxp/endpoints", + "method": "post", + "params": { + "name": "perffxp" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "SETTLEMENT_TRANSFER_POSITION_CHANGE_EMAIL", + "value": "{$inputs.email}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, + { + "id": 20, + "meta": { + "info": "DFSP Endpoint-NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL" + }, + "description": "DFSP Endpoint-NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/perffxp/endpoints", + "method": "post", + "params": { + "name": "perffxp" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "NET_DEBIT_CAP_THRESHOLD_BREACH_EMAIL", + "value": "{$inputs.email}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, + { + "id": 27, + "meta": { + "info": "Add participant with second currency" + }, + "description": "Add participant with second currency", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants", + "path": "/participants", + "method": "post", + "body": { + "name": "perffxp", + "currency": "{$inputs.currency2}" + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 400 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(400)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + }, + { + "id": 28, + "meta": { + "info": "Add initial position and limits with second currency" + }, + "description": "Add initial position and limits with second currency", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/initialPositionAndLimits", + "path": "/participants/perffxp/initialPositionAndLimits", + "method": "post", + "params": { + "name": "perffxp" + }, + "body": { + "currency": "{$inputs.currency2}", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 1000000 + }, + "initialPosition": 0 + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 500 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(500)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + }, + { + "id": 29, + "description": "Add participant with second currency CGS", + "meta": { + "info": "Add participant with second currency" + }, + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants", + "path": "/participants", + "method": "post", + "body": { + "name": "perffxp", + "currency": "{$inputs.cgscurrency}" + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 400 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(400)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + }, + { + "id": 30, + "description": "Add initial position and limits with second currency CGS", + "meta": { + "info": "Add initial position and limits with second currency" + }, + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/initialPositionAndLimits", + "path": "/participants/perffxp/initialPositionAndLimits", + "method": "post", + "params": { + "name": "perffxp" + }, + "body": { + "currency": "{$inputs.cgscurrency}", + "limit": { + "type": "NET_DEBIT_CAP", + "value": 1000000 + }, + "initialPosition": 0 + }, + "headers": { + "Content-Type": "application/json" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 201 if not exists or 500 if exists", + "exec": [ + "if (response.body.errorInformation) {", + " expect(response.status).to.equal(500)", + "} else {", + " expect(response.status).to.equal(201)", + "}" + ] + } + ] + } + } + ] + }, + { + "id": 2, + "name": "FXP fundsin", + "meta": { + "info": "FXP fundsin" + }, + "requests": [ + { + "id": 1, + "meta": { + "info": "FXP Get Status Request before deposit" + }, + "description": "FXP Get Status Request before deposit", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts", + "path": "/participants/perffxp/accounts", + "method": "get", + "params": { + "name": "perffxp" + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 200", + "exec": [ + "expect(response.status).to.equal(200)" + ] + } + ] + }, + "scripts": { + "postRequest": { + "exec": [ + "const jsonData = pm.response.body", + "console.log(jsonData)", + "for(var i in jsonData) {", + " if(jsonData[i].ledgerAccountType === 'SETTLEMENT' && jsonData[i].currency === pm.environment.get('currency')) {", + " pm.environment.set(\"senderSettlementAccountId\", jsonData[i].id)", + " pm.environment.set(\"senderSettlementAccountBalanceBeforeFundsIn\", jsonData[i].value)", + " }", + "}" + ] + } + } + }, + { + "id": 2, + "meta": { + "info": "Deposit Funds in Settlement Account - FXP" + }, + "description": "Deposit Funds in Settlement Account - FXP", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts/{id}", + "path": "/participants/perffxp/accounts/{$environment.senderSettlementAccountId}", + "method": "post", + "params": { + "name": "perffxp", + "id": "{$environment.senderSettlementAccountId}" + }, + "body": { + "transferId": "{$environment.senderfundsInPrepareTransferId}", + "externalReference": "string", + "action": "recordFundsIn", + "reason": "string", + "amount": { + "amount": "{$environment.senderfundsInPrepareAmount}", + "currency": "{$inputs.currency}" + }, + "extensionList": { + "extension": [ + { + "key": "string", + "value": "string" + } + ] + } + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 202", + "exec": [ + "expect(response.status).to.equal(202)" + ] + } + ] + }, + "scripts": { + "preRequest": { + "exec": [ + "var uuid = require('uuid');", + "pm.environment.set('senderfundsInPrepareTransferId', uuid.v4())", + "pm.environment.set('senderfundsInPrepareAmount', 5000000);" + ] + } + } + }, + { + "id": 3, + "meta": { + "info": "FXP Get Status Request after deposit" + }, + "description": "FXP Get Status Request after deposit", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts", + "path": "/participants/perffxp/accounts", + "method": "get", + "params": { + "name": "perffxp" + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 200", + "exec": [ + "expect(response.status).to.equal(200)" + ] + }, + { + "id": 2, + "description": "FXP Settlement Account Balance After FundsIn should be equal to the balance before plus the transfer amount", + "exec": [ + "expect(+environment.senderSettlementAccountBalanceAfterFundsIn).to.equal(+environment.senderSettlementAccountBalanceBeforeFundsIn - +environment.senderfundsInPrepareAmount)" + ] + } + ] + }, + "delay": "2500", + "scripts": { + "postRequest": { + "exec": [ + "const jsonData = pm.response.body", + "console.log(jsonData)", + "for(var i in jsonData) {", + " if(jsonData[i].ledgerAccountType === 'SETTLEMENT' && jsonData[i].currency === pm.environment.get('currency')) {", + " pm.environment.set(\"senderSettlementAccountBalanceAfterFundsIn\", jsonData[i].value)", + " }", + "}" + ] + } + } + }, + { + "id": 4, + "description": "Get Status Request before deposit for currency2", + "meta": { + "info": "Get Status Request before deposit" + }, + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts", + "path": "/participants/perffxp/accounts", + "method": "get", + "params": { + "name": "perffxp" + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 200", + "exec": [ + "expect(response.status).to.equal(200)" + ] + } + ] + }, + "scripts": { + "postRequest": { + "exec": [ + "const jsonData = pm.response.body", + "console.log(jsonData)", + "for(var i in jsonData) {", + " if(jsonData[i].ledgerAccountType === 'SETTLEMENT' && jsonData[i].currency === pm.environment.get('currency2')) {", + " pm.environment.set(\"senderCurrency2SettlementAccountId\", jsonData[i].id)", + " pm.environment.set(\"senderCurrency2SettlementAccountBalanceBeforeFundsIn\", jsonData[i].value)", + " }", + "}" + ] + } + } + }, + { + "id": 5, + "description": "Deposit Funds in Settlement Account currency2", + "meta": { + "info": "Deposit Funds in Settlement Account" + }, + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts/{id}", + "path": "/participants/perffxp/accounts/{$environment.senderCurrency2SettlementAccountId}", + "method": "post", + "params": { + "name": "perffxp", + "id": "{$environment.senderCurrency2SettlementAccountId}" + }, + "body": { + "transferId": "{$environment.senderfundsInPrepareTransferId}", + "externalReference": "string", + "action": "recordFundsIn", + "reason": "string", + "amount": { + "amount": "{$environment.senderfundsInPrepareAmountCurrency2}", + "currency": "{$inputs.currency2}" + }, + "extensionList": { + "extension": [ + { + "key": "string", + "value": "string" + } + ] + } + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 202", + "exec": [ + "expect(response.status).to.equal(202)" + ] + } + ] + }, + "scripts": { + "preRequest": { + "exec": [ + "var uuid = require('uuid');", + "pm.environment.set('senderfundsInPrepareTransferId', uuid.v4())", + "pm.environment.set('senderfundsInPrepareAmountCurrency2', 5000000);" + ] + } + } + }, + { + "id": 6, + "description": "Get Status Request after deposit for currency2", + "meta": { + "info": "Get Status Request after deposit" + }, + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/accounts", + "path": "/participants/perffxp/accounts", + "method": "get", + "params": { + "name": "perffxp" + }, + "headers": { + "Content-Type": "application/json", + "FSPIOP-Source": "{$inputs.hub_operator}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "tests": { + "assertions": [ + { + "id": 1, + "description": "status to be 200", + "exec": [ + "expect(response.status).to.equal(200)" + ] + }, + { + "id": 2, + "description": "Settlement Account Balance After FundsIn should be equal to the balance before plus the transfer amount", + "exec": [ + "expect(+environment.senderCurrency2SettlementAccountBalanceAfterFundsIn).to.equal(+environment.senderCurrency2SettlementAccountBalanceBeforeFundsIn - +environment.senderfundsInPrepareAmountCurrency2)" + ] + } + ] + }, + "delay": "2500", + "scripts": { + "postRequest": { + "exec": [ + "const jsonData = pm.response.body", + "console.log(jsonData)", + "for(var i in jsonData) {", + " if(jsonData[i].ledgerAccountType === 'SETTLEMENT' && jsonData[i].currency === pm.environment.get('currency2')) {", + " pm.environment.set(\"senderCurrency2SettlementAccountBalanceAfterFundsIn\", jsonData[i].value)", + " }", + "}" + ] + } + } + } + ] + } + ] +} diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/hub_setup.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/hub_setup.json index a5d91e5f..4e461cfe 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/hub_setup.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/hub_setup.json @@ -564,9 +564,9 @@ { "id": 1, "meta": { - "info": "Register MSISDN Oracle" + "info": "Register ACCOUNT_ID Oracle" }, - "description": "Register MSISDN Oracle", + "description": "Register ACCOUNT_ID Oracle", "apiVersion": { "minorVersion": 1, "majorVersion": 1, @@ -576,97 +576,7 @@ "path": "/oracles", "method": "post", "body": { - "oracleIdType": "MSISDN", - "endpoint": { - "value": "{$inputs.HOST_SIMULATOR}/oracle", - "endpointType": "URL" - }, - "currency": "{$inputs.currency}", - "isDefault": true - }, - "headers": { - "Content-Type": "application/vnd.interoperability.participants+json;version=1.0", - "Accept": "application/vnd.interoperability.participants+json;version=1", - "Date": "{$function.generic.curDate}" - }, - "url": "{$inputs.HOST_ACCOUNT_LOOKUP_ADMIN}", - "tests": { - "assertions": [ - { - "id": 1, - "description": "status to be 201 or errorCode 2001 already exists", - "exec": [ - "if (response.body.errorInformation) {", - " expect(response.body.errorInformation.errorCode).to.equal(\"2001\")", - "} else {", - " expect(response.status).to.equal(201)", - "}" - ] - } - ] - } - }, - { - "id": 2, - "meta": { - "info": "Register BUSINESS Oracle" - }, - "description": "Register BUSINESS Oracle", - "apiVersion": { - "minorVersion": 1, - "majorVersion": 1, - "type": "als_admin" - }, - "operationPath": "/oracles", - "path": "/oracles", - "method": "post", - "body": { - "oracleIdType": "BUSINESS", - "endpoint": { - "value": "{$inputs.HOST_SIMULATOR}/oracle", - "endpointType": "URL" - }, - "currency": "{$inputs.currency}", - "isDefault": true - }, - "headers": { - "Content-Type": "application/vnd.interoperability.participants+json;version=1.0", - "Accept": "application/vnd.interoperability.participants+json;version=1", - "Date": "{$function.generic.curDate}" - }, - "url": "{$inputs.HOST_ACCOUNT_LOOKUP_ADMIN}", - "tests": { - "assertions": [ - { - "id": 1, - "description": "status to be 201 or errorCode 2001 already exists", - "exec": [ - "if (response.body.errorInformation) {", - " expect(response.body.errorInformation.errorCode).to.equal(\"2001\")", - "} else {", - " expect(response.status).to.equal(201)", - "}" - ] - } - ] - } - }, - { - "id": 3, - "meta": { - "info": "Register ALIAS Oracle" - }, - "description": "Register ALIAS Oracle", - "apiVersion": { - "minorVersion": 1, - "majorVersion": 1, - "type": "als_admin" - }, - "operationPath": "/oracles", - "path": "/oracles", - "method": "post", - "body": { - "oracleIdType": "ALIAS", + "oracleIdType": "ACCOUNT_ID", "endpoint": { "value": "{$inputs.HOST_SIMULATOR}/oracle", "endpointType": "URL" diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp1.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp1.json index f11a2551..38e5d920 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp1.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp1.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP1_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP1_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP1_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP1_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP1_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP1_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP1_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP1_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP1_MSISDN}" + "ID": "{$inputs.PERF_FSP1_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP1_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp2.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp2.json index d211102b..0c4b3871 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp2.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp2.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP2_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP2_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP2_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP2_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP2_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP2_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP2_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP2_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP2_MSISDN}" + "ID": "{$inputs.PERF_FSP2_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP2_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp3.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp3.json index 70395bb6..6def302f 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp3.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp3.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP3_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP3_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP3_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP3_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP3_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP3_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP3_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP3_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP3_MSISDN}" + "ID": "{$inputs.PERF_FSP3_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP3_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp4.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp4.json index cf805ab6..a8886754 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp4.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp4.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP4_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP4_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP4_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP4_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP4_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP4_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP4_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP4_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP4_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP4_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP4_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP4_MSISDN}" + "ID": "{$inputs.PERF_FSP4_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP4_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp5.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp5.json index 9ff4874c..bfef8e48 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp5.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp5.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP5_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP5_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP5_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP5_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP5_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP5_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP5_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP5_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP5_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP5_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP5_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP5_MSISDN}" + "ID": "{$inputs.PERF_FSP5_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP5_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp6.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp6.json index b17aa037..874573ed 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp6.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp6.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP6_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP6_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP6_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP6_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP6_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP6_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP6_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP6_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP6_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP6_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP6_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP6_MSISDN}" + "ID": "{$inputs.PERF_FSP6_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP6_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp7.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp7.json index ba657d85..0b3166e7 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp7.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp7.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP7_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP7_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP7_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP7_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP7_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP7_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP7_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP7_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP7_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP7_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP7_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP7_MSISDN}" + "ID": "{$inputs.PERF_FSP7_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP7_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp8.json b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp8.json index fa37d212..ac970942 100644 --- a/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp8.json +++ b/docker/ml-testing-toolkit/test-cases/collections/provisioning/participant_perffsp8.json @@ -276,6 +276,43 @@ ] } }, + { + "id": 7.1, + "meta": { + "info": "Add callback - FX QUOTES PUT" + }, + "description": "Add callback - FX QUOTES PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP8_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP8_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_QUOTES", + "value": "{$inputs.PERF_FSP8_CALLBACK_ENDPOINT_BASE_URL}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 8, "meta": { @@ -350,6 +387,43 @@ ] } }, + { + "id": 9.1, + "meta": { + "info": "Add callback - FX TRANSFERS PUT" + }, + "description": "Add callback - FX TRANSFERS PUT", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP8_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP8_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_PUT", + "value": "{$inputs.PERF_FSP8_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 10, "meta": { @@ -387,6 +461,43 @@ ] } }, + { + "id": 10.1, + "meta": { + "info": "Add callback - FX TRANSFERS ERROR" + }, + "description": "Add callback - FX TRANSFERS ERROR", + "apiVersion": { + "minorVersion": 0, + "majorVersion": 1, + "type": "central_admin" + }, + "operationPath": "/participants/{name}/endpoints", + "path": "/participants/{$inputs.PERF_FSP8_ID}/endpoints", + "method": "post", + "params": { + "name": "{$inputs.PERF_FSP8_ID}" + }, + "url": "{$inputs.HOST_CENTRAL_LEDGER}", + "headers": { + "Content-Type": "application/json" + }, + "body": { + "type": "FSPIOP_CALLBACK_URL_FX_TRANSFER_ERROR", + "value": "{$inputs.PERF_FSP8_CALLBACK_ENDPOINT_BASE_URL}/fxTransfers/{{commitRequestId}}/error" + }, + "tests": { + "assertions": [ + { + "id": 1, + "description": "Status code is 201", + "exec": [ + "expect(response.status).to.equal(201)" + ] + } + ] + } + }, { "id": 11, "meta": { @@ -1509,11 +1620,11 @@ "asynchronous": true }, "operationPath": "/participants/{Type}/{ID}", - "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP8_MSISDN}", + "path": "/participants/{$inputs.toIdType}/{$inputs.PERF_FSP8_ADDRESS}", "method": "post", "params": { "Type": "{$inputs.toIdType}", - "ID": "{$inputs.PERF_FSP8_MSISDN}" + "ID": "{$inputs.PERF_FSP8_ADDRESS}" }, "headers": { "FSPIOP-Source": "{$inputs.PERF_FSP8_ID}", diff --git a/docker/ml-testing-toolkit/test-cases/environments/default-env.json b/docker/ml-testing-toolkit/test-cases/environments/default-env.json index afa8ef92..62875ef8 100644 --- a/docker/ml-testing-toolkit/test-cases/environments/default-env.json +++ b/docker/ml-testing-toolkit/test-cases/environments/default-env.json @@ -34,7 +34,7 @@ "payeefsp": "greenbankfsp", "payerfsp": "pinkbankfsp", "toFspId": "greenbankfsp", - "toIdType": "MSISDN", + "toIdType": "ACCOUNT_ID", "toIdValue": "27713803912", "mobileSimPayerFsp": "pinkbankfsp", "mobileSimPayeeFsp": "greenbankfsp", @@ -54,14 +54,15 @@ "PERF_FSP6_ID": "perffsp6", "PERF_FSP7_ID": "perffsp7", "PERF_FSP8_ID": "perffsp8", - "PERF_FSP1_MSISDN": "19012345001", - "PERF_FSP2_MSISDN": "19012345002", - "PERF_FSP3_MSISDN": "19012345003", - "PERF_FSP4_MSISDN": "19012345004", - "PERF_FSP5_MSISDN": "19012345005", - "PERF_FSP6_MSISDN": "19012345006", - "PERF_FSP7_MSISDN": "19012345007", - "PERF_FSP8_MSISDN": "19012345008", + "PERF_FSP1_ADDRESS": "19012345001", + "PERF_FSP2_ADDRESS": "19012345002", + "PERF_FSP3_ADDRESS": "19012345003", + "PERF_FSP4_ADDRESS": "19012345004", + "PERF_FSP5_ADDRESS": "19012345005", + "PERF_FSP6_ADDRESS": "19012345006", + "PERF_FSP7_ADDRESS": "19012345007", + "PERF_FSP8_ADDRESS": "19012345008", + "PERF_FXP_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffxp:3001/fxp", "PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp1:3001/fspiop", "PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp2:3001/fspiop", "PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp3:3001/fspiop", diff --git a/docker/ml-testing-toolkit/test-cases/environments/perf-e2e-env.json b/docker/ml-testing-toolkit/test-cases/environments/perf-e2e-env.json index 2c03e8ca..87f70c10 100644 --- a/docker/ml-testing-toolkit/test-cases/environments/perf-e2e-env.json +++ b/docker/ml-testing-toolkit/test-cases/environments/perf-e2e-env.json @@ -34,7 +34,7 @@ "payeefsp": "greenbankfsp", "payerfsp": "pinkbankfsp", "toFspId": "greenbankfsp", - "toIdType": "MSISDN", + "toIdType": "ACCOUNT_ID", "toIdValue": "27713803912", "mobileSimPayerFsp": "pinkbankfsp", "mobileSimPayeeFsp": "greenbankfsp", @@ -54,14 +54,15 @@ "PERF_FSP6_ID": "perffsp6", "PERF_FSP7_ID": "perffsp7", "PERF_FSP8_ID": "perffsp8", - "PERF_FSP1_MSISDN": "19012345001", - "PERF_FSP2_MSISDN": "19012345002", - "PERF_FSP3_MSISDN": "19012345003", - "PERF_FSP4_MSISDN": "19012345004", - "PERF_FSP5_MSISDN": "19012345005", - "PERF_FSP6_MSISDN": "19012345006", - "PERF_FSP7_MSISDN": "19012345007", - "PERF_FSP8_MSISDN": "19012345008", + "PERF_FSP1_ADDRESS": "19012345001", + "PERF_FSP2_ADDRESS": "19012345002", + "PERF_FSP3_ADDRESS": "19012345003", + "PERF_FSP4_ADDRESS": "19012345004", + "PERF_FSP5_ADDRESS": "19012345005", + "PERF_FSP6_ADDRESS": "19012345006", + "PERF_FSP7_ADDRESS": "19012345007", + "PERF_FSP8_ADDRESS": "19012345008", + "PERF_FXP_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffxp:3001/fxp", "PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp1:3001/fspiop", "PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp2:3001/fspiop", "PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL": "http://sim-perffsp3:3001/fspiop", diff --git a/docker/ml-testing-toolkit/test-cases/environments/remote-k8s-env.json b/docker/ml-testing-toolkit/test-cases/environments/remote-k8s-env.json index a762ac45..06a2e3db 100644 --- a/docker/ml-testing-toolkit/test-cases/environments/remote-k8s-env.json +++ b/docker/ml-testing-toolkit/test-cases/environments/remote-k8s-env.json @@ -17,7 +17,7 @@ "cgscurrency": "INR", "hubEmail": "some.email@gmail.com", "hub_operator": "NOT_APPLICABLE", - "toIdType": "MSISDN", + "toIdType": "ACCOUNT_ID", "NET_DEBIT_CAP": "50000000", "PERF_FSP1_ID": "perffsp1", "PERF_FSP2_ID": "perffsp2", @@ -27,14 +27,15 @@ "PERF_FSP6_ID": "perffsp6", "PERF_FSP7_ID": "perffsp7", "PERF_FSP8_ID": "perffsp8", - "PERF_FSP1_MSISDN": "19012345001", - "PERF_FSP2_MSISDN": "19012345002", - "PERF_FSP3_MSISDN": "19012345003", - "PERF_FSP4_MSISDN": "19012345004", - "PERF_FSP5_MSISDN": "19012345005", - "PERF_FSP6_MSISDN": "19012345006", - "PERF_FSP7_MSISDN": "19012345007", - "PERF_FSP8_MSISDN": "19012345008", + "PERF_FSP1_ADDRESS": "19012345001", + "PERF_FSP2_ADDRESS": "19012345002", + "PERF_FSP3_ADDRESS": "19012345003", + "PERF_FSP4_ADDRESS": "19012345004", + "PERF_FSP5_ADDRESS": "19012345005", + "PERF_FSP6_ADDRESS": "19012345006", + "PERF_FSP7_ADDRESS": "19012345007", + "PERF_FSP8_ADDRESS": "19012345008", + "PERF_FXP_CALLBACK_ENDPOINT_BASE_URL": "http://K6_CALLBACK_FQDN:25000/fxp", "PERF_FSP1_CALLBACK_ENDPOINT_BASE_URL": "http://K6_CALLBACK_FQDN:25001/fspiop", "PERF_FSP2_CALLBACK_ENDPOINT_BASE_URL": "http://K6_CALLBACK_FQDN:25002/fspiop", "PERF_FSP3_CALLBACK_ENDPOINT_BASE_URL": "http://K6_CALLBACK_FQDN:25003/fspiop", diff --git a/envs/perffxp.env b/envs/perffxp.env new file mode 100644 index 00000000..97e2f622 --- /dev/null +++ b/envs/perffxp.env @@ -0,0 +1,18 @@ +CBH_FSPIOP_FSP_ID=perffxp +CBH_FSPIOP_CALLBACK_HTTP_KEEPALIVE=true + +### FSPIOP Handlers +#### Use this if we want to hit the ALS +CBH_FSPIOP_ALS_ENDPOINT_URL=http://account-lookup-service:4002 +#### Use this if we want to bypass ALS +# CBH_FSPIOP_ALS_ENDPOINT_URL=http://sim-perffxp:3001/fspiop + +CBH_FSPIOP_TRANSFERS_ENDPOINT_URL=http://ml-api-adapter:3000 +# CBH_FSPIOP_TRANSFERS_ENDPOINT_URL=http://sim-perffsp2:3001/fspiop + +CBH_FSPIOP_QUOTES_ENDPOINT_URL=http://quoting-service:3002 +CBH_FSPIOP_QUOTES_ILPPACKET='AYIDGQAAAAAAACcQIWcuZ3JlZW5iYW5rZnNwLm1zaXNkbi4yNzcxMzgwMzkxMoIC62V5SjBjbUZ1YzJGamRHbHZia2xrSWpvaU1ERXhaR1EyTldZdE5UQXpNeTAwTVdNMkxUazFaR1l0T1RFeFl6WTRPVFExWWpobUlpd2ljWFZ2ZEdWSlpDSTZJbVF3TXpJMU1EVTJMVE0xTldFdE5EUmxNUzFpT1RnMExXWXdZVFExTmpFMFkyRXpPQ0lzSW5CaGVXVmxJanA3SW5CaGNuUjVTV1JKYm1adklqcDdJbkJoY25SNVNXUlVlWEJsSWpvaVRWTkpVMFJPSWl3aWNHRnlkSGxKWkdWdWRHbG1hV1Z5SWpvaU1qYzNNVE00TURNNU1USWlMQ0ptYzNCSlpDSTZJbWR5WldWdVltRnVhMlp6Y0NKOWZTd2ljR0Y1WlhJaU9uc2ljR0Z5ZEhsSlpFbHVabThpT25zaWNHRnlkSGxKWkZSNWNHVWlPaUpOVTBsVFJFNGlMQ0p3WVhKMGVVbGtaVzUwYVdacFpYSWlPaUkwTkRFeU16UTFOamM0T1NJc0ltWnpjRWxrSWpvaWNHbHVhMkpoYm10bWMzQWlmU3dpY0dWeWMyOXVZV3hKYm1adklqcDdJbU52YlhCc1pYaE9ZVzFsSWpwN0ltWnBjbk4wVG1GdFpTSTZJa1pwY25OMGJtRnRaUzFVWlhOMElpd2liR0Z6ZEU1aGJXVWlPaUpNWVhOMGJtRnRaUzFVWlhOMEluMHNJbVJoZEdWUFprSnBjblJvSWpvaU1UazROQzB3TVMwd01TSjlmU3dpWVcxdmRXNTBJanA3SW1OMWNuSmxibU41SWpvaVZWTkVJaXdpWVcxdmRXNTBJam9pTVRBd0luMHNJblJ5WVc1ellXTjBhVzl1Vkhsd1pTSTZleUp6WTJWdVlYSnBieUk2SWxSU1FVNVRSa1ZTSWl3aWFXNXBkR2xoZEc5eUlqb2lVRUZaUlZJaUxDSnBibWwwYVdGMGIzSlVlWEJsSWpvaVEwOU9VMVZOUlZJaWZYMAA' +CBH_FSPIOP_QUOTES_CONDITION='5m0gq_5dLQlTSSRKQmLpj0MZ1MtWLWgSu1oLGVTJyYs' +CBH_QUOTE_EXPIRATION_WINDOW=60000 + +CBH_FORKS=8 diff --git a/k8s-mojaloop-perf-tuning/patch.sh b/k8s-mojaloop-perf-tuning/patch.sh index 491ad58e..e9d037cb 100755 --- a/k8s-mojaloop-perf-tuning/patch.sh +++ b/k8s-mojaloop-perf-tuning/patch.sh @@ -59,15 +59,15 @@ init) ;; esac -kubectl apply --kubeconfig k8s.yaml -f "$DIR/config-override.yaml" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-account-lookup-service -p "$(envsubst <$DIR/account-service.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-ml-api-adapter-service -p "$(envsubst <$DIR/adapter-service.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-ml-api-adapter-handler-notification -p "$(envsubst <$DIR/adapter-handler.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-centralledger-handler-admin-transfer -p "$(envsubst <$DIR/transfer-admin.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-centralledger-handler-transfer-get -p "$(envsubst <$DIR/transfer-get.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-centralledger-handler-transfer-prepare -p "$(envsubst <$DIR/transfer-prepare.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-centralledger-handler-transfer-fulfil -p "$(envsubst <$DIR/transfer-fulfil.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-handler-pos-batch -p "$(envsubst <$DIR/transfer-position.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-centralledger-handler-timeout -p "$(envsubst <$DIR/transfer-timeout.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-quoting-service -p "$(envsubst <$DIR/quoting-service.yaml)" -kubectl patch deployment --kubeconfig k8s.yaml --namespace mojaloop moja-quoting-service-handler -p "$(envsubst <$DIR/quoting-handler.yaml)" +kubectl apply -f "$DIR/config-override.yaml" +kubectl patch deployment --namespace mojaloop moja-account-lookup-service -p "$(envsubst <$DIR/account-service.yaml)" +kubectl patch deployment --namespace mojaloop moja-ml-api-adapter-service -p "$(envsubst <$DIR/adapter-service.yaml)" +kubectl patch deployment --namespace mojaloop moja-ml-api-adapter-handler-notification -p "$(envsubst <$DIR/adapter-handler.yaml)" +kubectl patch deployment --namespace mojaloop moja-centralledger-handler-admin-transfer -p "$(envsubst <$DIR/transfer-admin.yaml)" +kubectl patch deployment --namespace mojaloop moja-centralledger-handler-transfer-get -p "$(envsubst <$DIR/transfer-get.yaml)" +kubectl patch deployment --namespace mojaloop moja-centralledger-handler-transfer-prepare -p "$(envsubst <$DIR/transfer-prepare.yaml)" +kubectl patch deployment --namespace mojaloop moja-centralledger-handler-transfer-fulfil -p "$(envsubst <$DIR/transfer-fulfil.yaml)" +kubectl patch deployment --namespace mojaloop moja-handler-pos-batch -p "$(envsubst <$DIR/transfer-position.yaml)" +kubectl patch deployment --namespace mojaloop moja-centralledger-handler-timeout -p "$(envsubst <$DIR/transfer-timeout.yaml)" +kubectl patch deployment --namespace mojaloop moja-quoting-service -p "$(envsubst <$DIR/quoting-service.yaml)" +kubectl patch deployment --namespace mojaloop moja-quoting-service-handler -p "$(envsubst <$DIR/quoting-handler.yaml)" diff --git a/packages/k6-tests/config-k8s/fspiopDFXRampingRate.json b/packages/k6-tests/config-k8s/fspiopDFXRampingRate.json new file mode 100644 index 00000000..1207fac7 --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopDFXRampingRate.json @@ -0,0 +1,129 @@ +{ + "scenarios": { + "fspiopDiscovery": { + "executor": "ramping-arrival-rate", + "exec": "fspiopDiscoveryScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 100, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 200, "duration": "90s" }, + { "target": 200, "duration": "3m" }, + { "target": 220, "duration": "90s" }, + { "target": 220, "duration": "3m" }, + { "target": 240, "duration": "90s" }, + { "target": 240, "duration": "3m" }, + { "target": 260, "duration": "90s" }, + { "target": 260, "duration": "3m" }, + { "target": 300, "duration": "90s" }, + { "target": 300, "duration": "3m" }, + { "target": 100, "duration": "90s" } + + ] + }, + "fspiopFXQuotes": { + "executor": "ramping-arrival-rate", + "exec": "fspiopFXQuotesScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 250, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 200, "duration": "90s" }, + { "target": 200, "duration": "3m" }, + { "target": 220, "duration": "90s" }, + { "target": 220, "duration": "3m" }, + { "target": 240, "duration": "90s" }, + { "target": 240, "duration": "3m" }, + { "target": 260, "duration": "90s" }, + { "target": 260, "duration": "3m" }, + { "target": 300, "duration": "90s" }, + { "target": 300, "duration": "3m" }, + { "target": 100, "duration": "90s" } + + ] + }, + "fspiopFXTransfers": { + "executor": "ramping-arrival-rate", + "exec": "fspiopFXTransfersScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 600, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 200, "duration": "90s" }, + { "target": 200, "duration": "3m" }, + { "target": 220, "duration": "90s" }, + { "target": 220, "duration": "3m" }, + { "target": 240, "duration": "90s" }, + { "target": 240, "duration": "3m" }, + { "target": 260, "duration": "90s" }, + { "target": 260, "duration": "3m" }, + { "target": 300, "duration": "90s" }, + { "target": 300, "duration": "3m" }, + { "target": 100, "duration": "90s" } + + ] + }, + "fspiopQuotes": { + "executor": "ramping-arrival-rate", + "exec": "fspiopQuotesScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 250, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 200, "duration": "90s" }, + { "target": 200, "duration": "3m" }, + { "target": 220, "duration": "90s" }, + { "target": 220, "duration": "3m" }, + { "target": 240, "duration": "90s" }, + { "target": 240, "duration": "3m" }, + { "target": 260, "duration": "90s" }, + { "target": 260, "duration": "3m" }, + { "target": 300, "duration": "90s" }, + { "target": 300, "duration": "3m" }, + { "target": 100, "duration": "90s" } + + ] + }, + "fspiopTransfers": { + "executor": "ramping-arrival-rate", + "exec": "fspiopTransfersScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 400, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 200, "duration": "90s" }, + { "target": 200, "duration": "3m" }, + { "target": 220, "duration": "90s" }, + { "target": 220, "duration": "3m" }, + { "target": 240, "duration": "90s" }, + { "target": 240, "duration": "3m" }, + { "target": 260, "duration": "90s" }, + { "target": 260, "duration": "3m" }, + { "target": 300, "duration": "90s" }, + { "target": 300, "duration": "3m" }, + { "target": 100, "duration": "90s" } + + ] + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopFXQuotes.json b/packages/k6-tests/config-k8s/fspiopFXQuotes.json new file mode 100644 index 00000000..72b68b7b --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopFXQuotes.json @@ -0,0 +1,22 @@ +{ + "scenarios": { + "fspiopQuotes": { + "executor": "ramping-vus", + "exec": "fspiopFXQuotesScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "startVUs": 5, + "stages": [ + { "duration": "30s", "target": 600 }, + { "duration": "1m", "target": 1000 }, + { "duration": "480s", "target": 1000 } + ] + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopFXQuotesRampingRate.json b/packages/k6-tests/config-k8s/fspiopFXQuotesRampingRate.json new file mode 100644 index 00000000..230bd8d3 --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopFXQuotesRampingRate.json @@ -0,0 +1,32 @@ +{ + "scenarios": { + "fspiopQuotes": { + "executor": "ramping-arrival-rate", + "exec": "fspiopFXQuotesScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 500, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 400, "duration": "3m" }, + { "target": 400, "duration": "3m" }, + { "target": 450, "duration": "90s" }, + { "target": 450, "duration": "3m" }, + { "target": 500, "duration": "90s" }, + { "target": 500, "duration": "3m" }, + { "target": 550, "duration": "90s" }, + { "target": 550, "duration": "3m" }, + { "target": 600, "duration": "90s" }, + { "target": 600, "duration": "3m" }, + { "target": 200, "duration": "90s" } + ] + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopFXTransfers.json b/packages/k6-tests/config-k8s/fspiopFXTransfers.json new file mode 100644 index 00000000..16935960 --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopFXTransfers.json @@ -0,0 +1,22 @@ +{ + "scenarios": { + "fspiopTransfers": { + "executor": "ramping-vus", + "exec": "fspiopFXTransfersScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "startVUs": 5, + "stages": [ + { "duration": "30s", "target": 600 }, + { "duration": "1m", "target": 2000 }, + { "duration": "480s", "target": 2000 } + ] + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopFXTransfersRampingRate.json b/packages/k6-tests/config-k8s/fspiopFXTransfersRampingRate.json new file mode 100644 index 00000000..499441a5 --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopFXTransfersRampingRate.json @@ -0,0 +1,32 @@ +{ + "scenarios": { + "fspiopTransfers": { + "executor": "ramping-arrival-rate", + "exec": "fspiopFXTransfersScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "preAllocatedVUs": 600, + "timeUnit": "1s", + "startRate": 10, + "stages": [ + { "target": 320, "duration": "90s" }, + { "target": 320, "duration": "3m" }, + { "target": 340, "duration": "90s" }, + { "target": 340, "duration": "3m" }, + { "target": 360, "duration": "90s" }, + { "target": 360, "duration": "3m" }, + { "target": 380, "duration": "90s" }, + { "target": 380, "duration": "3m" }, + { "target": 400, "duration": "90s" }, + { "target": 400, "duration": "3m" }, + { "target": 100, "duration": "90s" } + ] + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopQuotesRampingRate.json b/packages/k6-tests/config-k8s/fspiopQuotesRampingRate.json index 958c4cb1..4b96112c 100644 --- a/packages/k6-tests/config-k8s/fspiopQuotesRampingRate.json +++ b/packages/k6-tests/config-k8s/fspiopQuotesRampingRate.json @@ -6,7 +6,7 @@ "env": { "UNIDIRECTIONAL": "false" }, - "preAllocatedVUs": 500, + "preAllocatedVUs": 100, "timeUnit": "1s", "startRate": 10, "stages": [ diff --git a/packages/k6-tests/config-k8s/fspiopSingleFXQuote.json b/packages/k6-tests/config-k8s/fspiopSingleFXQuote.json new file mode 100644 index 00000000..383015ba --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopSingleFXQuote.json @@ -0,0 +1,18 @@ +{ + "scenarios": { + "fspiopQuotes": { + "executor": "shared-iterations", + "exec": "fspiopFXQuotesScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "vus": 1, + "iterations": 1 + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/config-k8s/fspiopSingleFXTransfer.json b/packages/k6-tests/config-k8s/fspiopSingleFXTransfer.json new file mode 100644 index 00000000..7b65d4d6 --- /dev/null +++ b/packages/k6-tests/config-k8s/fspiopSingleFXTransfer.json @@ -0,0 +1,18 @@ +{ + "scenarios": { + "fspiopTransfers": { + "executor": "shared-iterations", + "exec": "fspiopFXTransfersScenarios", + "env": { + "UNIDIRECTIONAL": "false" + }, + "vus": 1, + "iterations": 1 + } + }, + "thresholds": { + "iteration_duration": [ "p(95)<1000" ], + "http_req_failed": [ "rate<0.01" ], + "http_req_duration": [ "p(95)<1000" ] + } +} diff --git a/packages/k6-tests/index.js b/packages/k6-tests/index.js index 2d3e3664..fe7e94a4 100644 --- a/packages/k6-tests/index.js +++ b/packages/k6-tests/index.js @@ -1,8 +1,10 @@ export { fspiopDiscoveryScenarios } from './scenarios/fspiopDiscovery.js'; export { fspiopDiscoveryNoCallbackScenarios } from './scenarios/fspiopDiscoveryNoCallbackConstantRate.js'; export { fspiopTransfersScenarios } from './scenarios/fspiopTransfers.js'; +export { fspiopFXTransfersScenarios } from './scenarios/fspiopFXTransfers.js'; export { fspiopTransfersNoCallbackScenarios } from './scenarios/fspiopTransfersNoCallback.js'; export { fspiopQuotesScenarios } from './scenarios/fspiopQuotes.js'; +export { fspiopFXQuotesScenarios } from './scenarios/fspiopFXQuotes.js'; export { fspiopQuotesNoCallbackScenarios } from './scenarios/fspiopQuotesNoCallback.js'; export { fspiopParallelScenarios } from './scenarios/fspiopParallel.js'; export { fspiopQuotesPersonalInfoExtensionsScenarios } from './scenarios/fspiopQuotesPersonalInfoExtensions.js'; diff --git a/packages/k6-tests/scenarios/fspiopFXQuotes.js b/packages/k6-tests/scenarios/fspiopFXQuotes.js new file mode 100644 index 00000000..477a4ddf --- /dev/null +++ b/packages/k6-tests/scenarios/fspiopFXQuotes.js @@ -0,0 +1,6 @@ +import { postFXQuotes } from "../scripts/postFXQuotes.js"; + + +export function fspiopFXQuotesScenarios() { + postFXQuotes(); +} diff --git a/packages/k6-tests/scenarios/fspiopFXTransfers.js b/packages/k6-tests/scenarios/fspiopFXTransfers.js new file mode 100644 index 00000000..78a5577d --- /dev/null +++ b/packages/k6-tests/scenarios/fspiopFXTransfers.js @@ -0,0 +1,6 @@ +import { postFXTransfers } from "../scripts/postFXTransfers.js"; + + +export function fspiopFXTransfersScenarios() { + postFXTransfers(); +} diff --git a/packages/k6-tests/scripts/E2E.js b/packages/k6-tests/scripts/E2E.js index abb59768..fe149e36 100644 --- a/packages/k6-tests/scripts/E2E.js +++ b/packages/k6-tests/scripts/E2E.js @@ -48,7 +48,7 @@ export function E2E() { const traceId = traceParent.traceId; const wsTimeoutMs = Number(__ENV.K6_SCRIPT_WS_TIMEOUT_MS) || 2000; // user session between 5s and 1m - const wsChannelParties = `${traceParent.traceId}/PUT/parties/MSISDN/${payeeId}`; + const wsChannelParties = `${traceParent.traceId}/PUT/parties/ACCOUNT_ID/${payeeId}`; const wsURLParties = `${wsUrl}/${wsChannelParties}` const wsParties = new WebSocket(wsURLParties, null, {tags: {name: 'e2e parties ws'}}); @@ -217,14 +217,14 @@ export function E2E() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId } }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId } @@ -271,7 +271,7 @@ export function E2E() { }, }; - const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, params); + const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, params); check(res, { 'ALS_FSPIOP_GET_PARTIES_RESPONSE_IS_202' : (r) => r.status == 202 }); wsTimeoutId = setTimeout(() => { diff --git a/packages/k6-tests/scripts/getParties.js b/packages/k6-tests/scripts/getParties.js index 19b47327..e35a8dcb 100644 --- a/packages/k6-tests/scripts/getParties.js +++ b/packages/k6-tests/scripts/getParties.js @@ -47,7 +47,7 @@ export function getParties() { const wsUrl = payerFsp['wsUrl']; const traceParent = Trace(); const traceId = traceParent.traceId; - const wsChannel = `${traceParent.traceId}/PUT/parties/MSISDN/${payeeId}`; + const wsChannel = `${traceParent.traceId}/PUT/parties/ACCOUNT_ID/${payeeId}`; const wsURL = `${wsUrl}/${wsChannel}` const ws = new WebSocket(wsURL, null, {tags: {name: 'parties ws'}}); const wsTimeoutMs = Number(__ENV.K6_SCRIPT_WS_TIMEOUT_MS) || 2000; // user session between 5s and 1m @@ -109,11 +109,11 @@ export function getParties() { // // OPTIONAL: Lets send the ORACLE GET /participants request to the Oracle to resolve FSPID for payeeId. // // Useful when bypassing the ALS and testing directly against a Simulator. - // const resOracleGetParticipantsForPayee = http.get(`${__ENV.K6_SCRIPT_ORACLE_ENDPOINT_URL}/participants/MSISDN/${payeeId}`, params); + // const resOracleGetParticipantsForPayee = http.get(`${__ENV.K6_SCRIPT_ORACLE_ENDPOINT_URL}/participants/ACCOUNT_ID/${payeeId}`, params); // check(resOracleGetParticipantsForPayee, { 'ALS_ORACLE_GET_PARTICIPANTS_RESPONSE_IS_200' : (r) => r.status == 200 }); // Lets send the FSPIOP GET /parties request to the ALS - const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, params); + const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, params); check(res, { 'ALS_FSPIOP_GET_PARTIES_RESPONSE_IS_202' : (r) => r.status == 202 }); wsTimeoutId = setTimeout(() => { diff --git a/packages/k6-tests/scripts/getPartiesNoCallback.js b/packages/k6-tests/scripts/getPartiesNoCallback.js index c8265d83..c028d03f 100644 --- a/packages/k6-tests/scripts/getPartiesNoCallback.js +++ b/packages/k6-tests/scripts/getPartiesNoCallback.js @@ -49,7 +49,7 @@ export function getPartiesNoCallback() { }; // Lets send the FSPIOP GET /parties request to the ALS - const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, params); + const res = http.get(`${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, params); check(res, { 'ALS_FSPIOP_GET_PARTIES_RESPONSE_IS_202' : (r) => r.status == 202 }); }); } \ No newline at end of file diff --git a/packages/k6-tests/scripts/inboundSDKGetParties.js b/packages/k6-tests/scripts/inboundSDKGetParties.js index 776bfad4..aa7ab7fc 100644 --- a/packages/k6-tests/scripts/inboundSDKGetParties.js +++ b/packages/k6-tests/scripts/inboundSDKGetParties.js @@ -36,7 +36,7 @@ export function getParties() { const wsUrl = payerFsp['wsUrl']; const traceParent = Trace(); const traceId = traceParent.traceId; - const wsChannel = `${traceParent.traceId}/PUT/parties/MSISDN/${payeeId}`; + const wsChannel = `${traceParent.traceId}/PUT/parties/ACCOUNT_ID/${payeeId}`; const wsURL = `${wsUrl}/${wsChannel}` const ws = new WebSocket(wsURL); @@ -84,7 +84,7 @@ export function getParties() { }; // Lets send the GET /parties request to the SDK - const res = http.get(`${__ENV.K6_SCRIPT_SDK_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, params); + const res = http.get(`${__ENV.K6_SCRIPT_SDK_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, params); check(res, { 'SDK_GET_PARTIES_RESPONSE_IS_202' : (r) => r.status == 202 }); wsTimeoutId = setTimeout(() => { diff --git a/packages/k6-tests/scripts/inboundSDKQuotes.js b/packages/k6-tests/scripts/inboundSDKQuotes.js index 79389efd..b2bb3128 100644 --- a/packages/k6-tests/scripts/inboundSDKQuotes.js +++ b/packages/k6-tests/scripts/inboundSDKQuotes.js @@ -95,14 +95,14 @@ export function postQuotes() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId } }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId } diff --git a/packages/k6-tests/scripts/outboundSDKGetParties.js b/packages/k6-tests/scripts/outboundSDKGetParties.js index 45a5295b..fddb6e91 100644 --- a/packages/k6-tests/scripts/outboundSDKGetParties.js +++ b/packages/k6-tests/scripts/outboundSDKGetParties.js @@ -43,7 +43,7 @@ export function getParties() { }, }; - const res = http.get(`${__ENV.K6_SCRIPT_SDK_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, params); + const res = http.get(`${__ENV.K6_SCRIPT_SDK_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, params); check(res, { 'SDK_GET_PARTIES_RESPONSE_IS_200' : (r) => r.status == 200 }); }); diff --git a/packages/k6-tests/scripts/outboundSDKQuotes.js b/packages/k6-tests/scripts/outboundSDKQuotes.js index 011935c2..c10ea698 100644 --- a/packages/k6-tests/scripts/outboundSDKQuotes.js +++ b/packages/k6-tests/scripts/outboundSDKQuotes.js @@ -55,14 +55,14 @@ export function postQuotes() { "transactionId": transactionId, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId } }, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId } diff --git a/packages/k6-tests/scripts/outboundSDKTransfers.js b/packages/k6-tests/scripts/outboundSDKTransfers.js index cf65a160..e02f06bf 100644 --- a/packages/k6-tests/scripts/outboundSDKTransfers.js +++ b/packages/k6-tests/scripts/outboundSDKTransfers.js @@ -46,7 +46,7 @@ export function postTransfers() { "homeTransactionId": "string", "from": { "type": "CONSUMER", - "idType": "MSISDN", + "idType": "ACCOUNT_ID", "idValue": "payerFspId", "displayName": "test payer", "firstName": "Henrik", @@ -55,7 +55,7 @@ export function postTransfers() { }, "to": { "type": "CONSUMER", - "idType": "MSISDN", + "idType": "ACCOUNT_ID", "idValue": "payeeFspId" }, "amountType": "SEND", diff --git a/packages/k6-tests/scripts/parallelRequests.js b/packages/k6-tests/scripts/parallelRequests.js index ff4cdf31..94fe569d 100644 --- a/packages/k6-tests/scripts/parallelRequests.js +++ b/packages/k6-tests/scripts/parallelRequests.js @@ -86,7 +86,7 @@ export function parallelRequests() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId, "extensionList": { @@ -113,7 +113,7 @@ export function parallelRequests() { }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId, "extensionList": { @@ -196,7 +196,7 @@ export function parallelRequests() { } const res = http.batch([ - ['GET', `${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/MSISDN/${payeeId}`, null, partiesParams], + ['GET', `${__ENV.K6_SCRIPT_FSPIOP_ALS_ENDPOINT_URL}/parties/ACCOUNT_ID/${payeeId}`, null, partiesParams], ['POST', `${__ENV.K6_SCRIPT_FSPIOP_QUOTES_ENDPOINT_URL}/quotes`, JSON.stringify(quotesBody), quotesParams], ['POST', `${__ENV.K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL}/transfers`, JSON.stringify(transfersBody), transfersParams] ]) diff --git a/packages/k6-tests/scripts/postFXQuotes.js b/packages/k6-tests/scripts/postFXQuotes.js new file mode 100644 index 00000000..8dbb1cb6 --- /dev/null +++ b/packages/k6-tests/scripts/postFXQuotes.js @@ -0,0 +1,125 @@ +import http from 'k6/http'; +// import { crypto } from "k6/experimental/webcrypto"; +import { check, fail, sleep, group } from 'k6'; +import { WebSocket } from 'k6/experimental/websockets'; +import { setTimeout, clearTimeout, setInterval, clearInterval } from 'k6/timers'; +import { Trace } from "../common/trace.js"; +import { getTwoItemsFromArray } from "../common/utils.js"; +import { uuid } from '../common/uuid.js' +import exec from 'k6/execution'; + +function log() { + console.log(`Env Vars -->`); + console.log(` K6_SCRIPT_WS_TIMEOUT_MS=${__ENV.K6_SCRIPT_WS_TIMEOUT_MS}`); + console.log(` K6_SCRIPT_FSPIOP_QUOTES_ENDPOINT_URL=${__ENV.K6_SCRIPT_FSPIOP_QUOTES_ENDPOINT_URL}`); + console.log(` K6_SCRIPT_FSPIOP_FSP_POOL=${__ENV.K6_SCRIPT_FSPIOP_FSP_POOL}`); +} + +const fspList = JSON.parse(__ENV.K6_SCRIPT_FSPIOP_FSP_POOL) +const amount = __ENV.K6_SCRIPT_FSPIOP_QUOTES_AMOUNT.toString() +const currency = __ENV.K6_SCRIPT_FSPIOP_QUOTES_CURRENCY +const targetCurrency = __ENV.K6_SCRIPT_FSPIOP_QUOTES_TARGET_CURRENCY + +export function postFXQuotes() { + !exec.instance.iterationsCompleted && log(); + group("Post FX Quotes", function () { + let payerFsp + + if (__ENV.UNIDIRECTIONAL === "true" || __ENV.UNIDIRECTIONAL === "TRUE") { + payerFsp = fspList[0] + } else { + const selectedFsps = getTwoItemsFromArray(fspList) + payerFsp = selectedFsps[0] + } + + const startTs = Date.now(); + // const quoteId = crypto.randomUUID(); + // const transactionId = crypto.randomUUID(); + const conversionRequestId = uuid(); + const conversionId = uuid(); + const transactionId = uuid(); + const payerFspId = payerFsp['fspId']; + const payeeFspId = 'perffxp'; + const wsUrl = payerFsp['wsUrl']; + const traceParent = Trace(); + const traceId = traceParent.traceId; + const wsChannel = `${traceParent.traceId}/PUT/fxQuotes/${conversionRequestId}`; + const wsURL = `${wsUrl}/${wsChannel}` + const ws = new WebSocket(wsURL, null, {tags: {name: 'fx quotes ws'}}); + const wsTimeoutMs = Number(__ENV.K6_SCRIPT_WS_TIMEOUT_MS) || 2000; // user session between 5s and 1m + + var wsTimeoutId = null; + + const clearTimers = () => { + if (wsTimeoutId) { clearTimeout(wsTimeoutId); wsTimeoutId=null } + } + + ws.onclose(() => { + clearTimers(); + }); + + ws.onerror((err) => { + console.error(traceId, err); + check(err, { 'QUOTES_E2E_FSPIOP_POST_FX_QUOTES_SUCCESS': (cbMessage) => false }); + clearTimers(); + ws.close(); + }); + + ws.onmessage = (event) => { + __ENV.K6_DEBUG && console.info(traceId, `WS message received [${wsChannel}]: ${event.data}`); + check(event.data, { 'QUOTES_E2E_FSPIOP_POST_FX_QUOTES_SUCCESS': (cbMessage) => cbMessage == 'SUCCESS_CALLBACK_RECEIVED' }); + clearTimers(); + ws.close(); + // sleep(1); + }; + + ws.onopen = () => { + __ENV.K6_DEBUG && console.info(traceId, `WS open on URL: ${wsURL}`); + const params = { + tags: { + payerFspId, + payeeFspId + }, + headers: { + 'accept': 'application/vnd.interoperability.fxQuotes+json;version=1.0', + 'Content-Type': 'application/vnd.interoperability.fxQuotes+json;version=1.0', + 'FSPIOP-Source': payerFspId, + 'FSPIOP-Destination': payeeFspId, + 'Date': (new Date()).toUTCString(), + 'traceparent': traceParent.toString(), + 'tracestate': `tx_end2end_start_ts=${startTs}` + }, + }; + + const body = { + "conversionRequestId": conversionRequestId, + "conversionTerms": { + "conversionId": conversionId, + "initiatingFsp" : payerFspId, + "determiningTransferId": transactionId, + "counterPartyFsp": payeeFspId, + "amountType": "SEND", + "expiration": "2030-01-01T00:00:00.000Z", + "sourceAmount": { + "amount": `${amount}`, + "currency": `${currency}` + }, + "targetAmount": { + "currency": `${targetCurrency}` + } + } + } + + // Lets send the FSPIOP POST /quotes request + const res = http.post(`${__ENV.K6_SCRIPT_FSPIOP_QUOTES_ENDPOINT_URL}/fxQuotes`, JSON.stringify(body), params); + check(res, { 'QUOTES_FSPIOP_POST_FX_QUOTES_RESPONSE_IS_202' : (r) => r.status == 202 }); + + wsTimeoutId = setTimeout(() => { + const errorMsg = `WS timed-out on URL: ${wsURL}` + console.error(traceId, errorMsg); + check(res, { 'QUOTES_E2E_FSPIOP_POST_FX_QUOTES_SUCCESS': (cbMessage) => false }); + ws.close(); + }, wsTimeoutMs); + }; + }); +} diff --git a/packages/k6-tests/scripts/postFXTransfers.js b/packages/k6-tests/scripts/postFXTransfers.js new file mode 100644 index 00000000..a97590d4 --- /dev/null +++ b/packages/k6-tests/scripts/postFXTransfers.js @@ -0,0 +1,141 @@ +import http from 'k6/http'; +import { crypto } from "k6/experimental/webcrypto"; +import { check, fail, sleep, group } from 'k6'; +import exec from 'k6/execution'; +import { WebSocket } from 'k6/experimental/websockets'; +import { setTimeout, clearTimeout, setInterval, clearInterval } from 'k6/timers'; +import { Trace } from "../common/trace.js"; +import { getTwoItemsFromArray } from "../common/utils.js"; +import { uuid } from '../common/uuid.js' + +function log() { + console.log('Env Vars -->'); + console.log(` K6_SCRIPT_WS_TIMEOUT_MS=${__ENV.K6_SCRIPT_WS_TIMEOUT_MS}`); + console.log(` K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL=${__ENV.K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL}`); + console.log(` K6_SCRIPT_FSPIOP_FSP_POOL=${__ENV.K6_SCRIPT_FSPIOP_FSP_POOL}`); + console.log(` K6_SCRIPT_ABORT_ON_ERROR=${__ENV.K6_SCRIPT_ABORT_ON_ERROR}`); +} + +const fspList = JSON.parse(__ENV.K6_SCRIPT_FSPIOP_FSP_POOL) + +const ilpPacket = __ENV.K6_SCRIPT_FSPIOP_TRANSFERS_ILPPACKET +const condition = __ENV.K6_SCRIPT_FSPIOP_TRANSFERS_CONDITION +const amount = __ENV.K6_SCRIPT_FSPIOP_TRANSFERS_AMOUNT.toString() +const currency = __ENV.K6_SCRIPT_FSPIOP_TRANSFERS_CURRENCY +const targetCurrency = __ENV.K6_SCRIPT_FSPIOP_TRANSFERS_TARGET_CURRENCY +const abortOnError = (__ENV.K6_SCRIPT_ABORT_ON_ERROR && __ENV.K6_SCRIPT_ABORT_ON_ERROR.toLowerCase() === 'true') ? true : false + +export function postFXTransfers() { + !exec.instance.iterationsCompleted && log(); + group("Post FX Transfers", function () { + let payerFsp + let payeeFsp + + if (__ENV.UNIDIRECTIONAL === "true" || __ENV.UNIDIRECTIONAL === "TRUE") { + payerFsp = fspList[0] + payeeFsp = fspList[1] + } else { + const selectedFsps = getTwoItemsFromArray(fspList) + payerFsp = selectedFsps[0] + payeeFsp = selectedFsps[1] + } + + const startTs = Date.now(); + // const transferId = crypto.randomUUID(); + const commitRequestId = uuid(); + const determiningTransferId = uuid(); + const payerFspId = payerFsp['fspId']; + const payeeFspId = 'perffxp'; + const wsUrl = payerFsp['wsUrl']; + const traceParent = Trace(); + const traceId = traceParent.traceId; + const wsChannel = `${traceParent.traceId}/PUT/fxTransfers/${commitRequestId}`; + const wsURL = `${wsUrl}/${wsChannel}` + const ws = new WebSocket(wsURL, null, {tags: {name: 'transfers ws'}}); + const wsTimeoutMs = Number(__ENV.K6_SCRIPT_WS_TIMEOUT_MS) || 2000; // user session between 5s and 1m + + var wsTimeoutId = null; + + const clearTimers = () => { + if (wsTimeoutId) { clearTimeout(wsTimeoutId); wsTimeoutId=null } + } + + ws.onclose(() => { + clearTimers(); + }); + + ws.onerror((err) => { + console.error(traceId, err); + check(err, { 'TRANSFERS_E2E_FSPIOP_POST_FX_TRANSFERS_SUCCESS': (cbMessage) => false }); + clearTimers(); + ws.close(); + }); + + ws.onmessage = (event) => { + __ENV.K6_DEBUG && console.info(traceId, `WS message received [${wsChannel}]: ${event.data}`); + check(event.data, { 'TRANSFERS_E2E_FSPIOP_POST_FX_TRANSFERS_SUCCESS': (cbMessage) => cbMessage == 'SUCCESS_CALLBACK_RECEIVED' }); + clearTimers(); + ws.close(); + // sleep(1); + }; + + ws.onopen = () => { + // __ENV.K6_DEBUG && console.info(traceId, `WS open on URL: ${wsURL}`); + const params = { + tags: { + payerFspId, + payeeFspId + }, + headers: { + 'Accept': 'application/vnd.interoperability.transfers+json;version=1.1', + 'Content-Type': 'application/vnd.interoperability.transfers+json;version=1.1', + 'FSPIOP-Source': payerFspId, + 'FSPIOP-Destination': payeeFspId, + 'Date': (new Date()).toUTCString(), + 'traceparent': traceParent.toString(), + 'tracestate': `tx_end2end_start_ts=${startTs}` + }, + }; + + const body = { + "commitRequestId": commitRequestId, + "determiningTransferId": determiningTransferId, + "initiatingFsp": payerFspId, + "counterPartyFsp": payeeFspId, + "sourceAmount": { + amount, + currency + }, + "targetAmount": { + amount, + currency: targetCurrency + }, + "expiration": "2030-01-01T00:00:00.000Z", + condition + } + + // Lets send the FSPIOP POST /transfers request + const res = http.post(`${__ENV.K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL}/fxTransfers`, JSON.stringify(body), params); + check(res, { 'TRANSFERS_FSPIOP_POST_FX_TRANSFERS_RESPONSE_IS_202' : (r) => r.status == 202 }); + + if (abortOnError && res.status != 202) { + // Abort the entire k6 test exection runner + console.error(traceId, `FSPIOP POST /fxTransfers returned status: ${res.status}`); + ws.close(); + exec.test.abort() + } + + wsTimeoutId = setTimeout(() => { + const errorMsg = `WS timed-out on URL: ${wsURL}` + console.error(traceId, errorMsg); + check(res, { 'TRANSFERS_E2E_FSPIOP_POST_FX_TRANSFERS_SUCCESS': (cbMessage) => false }); + ws.close(); + if (abortOnError) { + // Abort the entire k6 test exection runner + console.error(traceId, 'Aborting k6 test execution!') + exec.test.abort() + } + }, wsTimeoutMs); + }; + }); +} diff --git a/packages/k6-tests/scripts/postQuotes.js b/packages/k6-tests/scripts/postQuotes.js index 22a0940e..5195ccd5 100644 --- a/packages/k6-tests/scripts/postQuotes.js +++ b/packages/k6-tests/scripts/postQuotes.js @@ -97,14 +97,14 @@ export function postQuotes() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId } }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId } diff --git a/packages/k6-tests/scripts/postQuotesNoCallback.js b/packages/k6-tests/scripts/postQuotesNoCallback.js index 938d10d4..52cdf465 100644 --- a/packages/k6-tests/scripts/postQuotesNoCallback.js +++ b/packages/k6-tests/scripts/postQuotesNoCallback.js @@ -62,7 +62,7 @@ export function postQuotesNoCallback() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId, "extensionList": { @@ -89,7 +89,7 @@ export function postQuotesNoCallback() { }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId, "extensionList": { diff --git a/packages/k6-tests/scripts/postQuotesPersonalInfoExtensions.js b/packages/k6-tests/scripts/postQuotesPersonalInfoExtensions.js index ad23c1c7..4856f4c0 100644 --- a/packages/k6-tests/scripts/postQuotesPersonalInfoExtensions.js +++ b/packages/k6-tests/scripts/postQuotesPersonalInfoExtensions.js @@ -94,7 +94,7 @@ export function postQuotes() { "transactionId": transactionId, "payer": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payerFsp['partyId']}`, "fspId": payerFspId, "extensionList": { @@ -121,7 +121,7 @@ export function postQuotes() { }, "payee": { "partyIdInfo": { - "partyIdType": "MSISDN", + "partyIdType": "ACCOUNT_ID", "partyIdentifier": `${payeeFsp['partyId']}`, "fspId": payeeFspId, "extensionList": { diff --git a/perf-test.sh b/perf-test.sh index b94e21d8..f1379570 100755 --- a/perf-test.sh +++ b/perf-test.sh @@ -1,7 +1,7 @@ #!/bin/bash export K6_SCRIPT_CONFIG_FOLDER_NAME="config-k8s" -args="$1$2" +args="$1$2$3" case "$args" in discovery) @@ -20,30 +20,58 @@ quote) echo "Testing single quote" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopSingleQuote.json docker compose --project-name load -f docker-compose-load.yml up ;; +fxquote) + echo "Testing single FX quote" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopSingleFXQuote.json docker compose --project-name load -f docker-compose-load.yml up +;; quotes) echo "Testing quotes" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopQuotes.json docker compose --project-name load -f docker-compose-load.yml up -d ;; +fxquotes) + echo "Testing FX quotes" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopFXQuotes.json docker compose --project-name load -f docker-compose-load.yml up -d +;; quotesrate) echo "Testing quotes with ramping rates" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopQuotesRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d ;; +fxquotesrate) + echo "Testing quotes with ramping rates" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopFXQuotesRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d +;; transfer) echo "Testing single transfer" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopSingleTransfer.json docker compose --project-name load -f docker-compose-load.yml up ;; +fxtransfer) + echo "Testing single FX transfer" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopSingleFXTransfer.json docker compose --project-name load -f docker-compose-load.yml up +;; transfers) echo "Testing transfers" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopTransfers.json docker compose --project-name load -f docker-compose-load.yml up -d ;; +fxtransfers) + echo "Testing FX transfers" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopFXTransfers.json docker compose --project-name load -f docker-compose-load.yml up -d +;; transfersrate) echo "Testing transfers with ramping rates" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopTransfersRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d ;; +fxtransfersrate) + echo "Testing FX transfers with ramping rates" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopFXTransfersRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d +;; dqtrate) echo "Testing account discoveries, quotes and transfers in parallel with constant rates" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopDQTRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d ;; +dfxrate) + echo "Testing account discoveries, FX quotes and FX transfers in parallel with constant rates" + env K6_SCRIPT_CONFIG_FILE_NAME=fspiopDFXRampingRate.json docker compose --project-name load -f docker-compose-load.yml up -d +;; e2e) echo "Testing multiple end to end" env K6_SCRIPT_CONFIG_FILE_NAME=fspiopE2E.json docker compose --project-name load -f docker-compose-load.yml up -d @@ -65,6 +93,10 @@ simrestart) docker compose --project-name simulators -f docker-compose-perf.yml --profile 8dfsp --profile testing-toolkit --profile oracle down -v docker compose --project-name simulators -f docker-compose-perf.yml --profile 8dfsp --profile testing-toolkit --profile ttk-provisioning-remote-k8s --profile oracle up -d ;; +simupdate) + echo "Updating the simulators" + docker compose --project-name simulators -f docker-compose-perf.yml --profile 8dfsp --profile testing-toolkit --profile oracle up -d +;; *) echo "Usage: " echo " $0 discovery" diff --git a/perf.env b/perf.env index 34e7a2d6..45f3f144 100644 --- a/perf.env +++ b/perf.env @@ -50,6 +50,7 @@ K6_SCRIPT_ORACLE_ENDPOINT_URL=http://callback-handler-svc-oracle-sim:3001/oracle K6_SCRIPT_FSPIOP_QUOTES_ENDPOINT_URL=http://quoting-service:3002 K6_SCRIPT_FSPIOP_QUOTES_AMOUNT=2 K6_SCRIPT_FSPIOP_QUOTES_CURRENCY=USD +K6_SCRIPT_FSPIOP_QUOTES_TARGET_CURRENCY=BGN K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL=http://ml-api-adapter:3000 # K6_SCRIPT_FSPIOP_TRANSFERS_ENDPOINT_URL=http://sim-perffsp2:3001/fspiop @@ -57,6 +58,7 @@ K6_SCRIPT_FSPIOP_TRANSFERS_ILPPACKET='AYIDGQAAAAAAACcQIWcuZ3JlZW5iYW5rZnNwLm1zaX K6_SCRIPT_FSPIOP_TRANSFERS_CONDITION='5m0gq_5dLQlTSSRKQmLpj0MZ1MtWLWgSu1oLGVTJyYs' K6_SCRIPT_FSPIOP_TRANSFERS_AMOUNT=2 K6_SCRIPT_FSPIOP_TRANSFERS_CURRENCY=USD +K6_SCRIPT_FSPIOP_TRANSFERS_TARGET_CURRENCY=BGN K6_SCRIPT_CONFIG_FILE_NAME=test.json