account-lookup-service 15.5.0-iso.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. package/.circleci/config.yml +11 -0
  2. package/.ncurc.yaml +6 -0
  3. package/.nvmrc +1 -0
  4. package/.nycrc.yml +20 -0
  5. package/.versionrc +15 -0
  6. package/CHANGELOG.md +330 -0
  7. package/CODEOWNERS +38 -0
  8. package/Dockerfile +45 -0
  9. package/LICENSE.md +10 -0
  10. package/README.md +252 -0
  11. package/audit-ci.jsonc +32 -0
  12. package/audit-resolve.json +161 -0
  13. package/config/default.json +109 -0
  14. package/config/knexfile.js +21 -0
  15. package/docker/account-lookup-service/default.json +106 -0
  16. package/docker/account-lookup-service/make-default-json.sh +5 -0
  17. package/docker/account-lookup-service/override.json +15 -0
  18. package/docker/central-ledger/default.json +458 -0
  19. package/docker/config-modifier/account-lookup-service.js +31 -0
  20. package/docker/kafka/consumer.properties +26 -0
  21. package/docker/kafka/producer.properties +45 -0
  22. package/docker/kafka/server.properties +143 -0
  23. package/docker/kafka/tools-log4j.properties +21 -0
  24. package/docker/mock-proxy/Dockerfile +15 -0
  25. package/docker/mock-proxy/package-lock.json +4986 -0
  26. package/docker/mock-proxy/package.json +24 -0
  27. package/docker/mock-proxy/src/config.ts +14 -0
  28. package/docker/mock-proxy/src/server.ts +94 -0
  29. package/docker/mock-proxy/src/utils.ts +29 -0
  30. package/docker/mock-proxy/tsconfig.json +24 -0
  31. package/docker/sql-init/01_permissions.sql +2 -0
  32. package/docker/sql-init-central-ledger/01_permissions.sql +2 -0
  33. package/docker/wait-for/wait-for-account-lookup-service.sh +10 -0
  34. package/docker/wait-for/wait-for-central-ledger.sh +11 -0
  35. package/docker/wait-for/wait-for-kafka.sh +7 -0
  36. package/docker/wait-for/wait-for-ml-api-adapter.sh +9 -0
  37. package/docker/wait-for/wait-for-mockserver.sh +20 -0
  38. package/docker/wait-for/wait-for-mysql-als.sh +14 -0
  39. package/docker/wait-for/wait-for-mysql-central-ledger.sh +11 -0
  40. package/docker/wait-for/wait-for-mysql.sh +11 -0
  41. package/docker/wait-for/wait-for-objstore.sh +12 -0
  42. package/docker/wait-for/wait-for.env +18 -0
  43. package/docker/wait-for/wait-for.sh +81 -0
  44. package/docker-compose.integration.yml +29 -0
  45. package/docker-compose.yml +243 -0
  46. package/jest-int.config.js +8 -0
  47. package/jest.config.js +16 -0
  48. package/jsdoc.json +38 -0
  49. package/migrations/01_currency.js +42 -0
  50. package/migrations/02_endpointType.js +43 -0
  51. package/migrations/03_endpointType-indexes.js +37 -0
  52. package/migrations/04_partyIdType.js +43 -0
  53. package/migrations/05_partyIdType-indexes.js +38 -0
  54. package/migrations/08_oracleEndpoint.js +51 -0
  55. package/migrations/09_oracleEndpoint-indexes.js +41 -0
  56. package/migrations/10_oracleEndpoint-remove-constraints.js +38 -0
  57. package/package.json +180 -0
  58. package/scripts/_wait4_all.js +143 -0
  59. package/scripts/test-functional.sh +76 -0
  60. package/secrets/jwsSigningKey.key +27 -0
  61. package/seeds/currency.js +765 -0
  62. package/seeds/endpointType.js +65 -0
  63. package/seeds/partyIdType.js +79 -0
  64. package/src/api/endpointcache.js +67 -0
  65. package/src/api/health.js +66 -0
  66. package/src/api/index.js +85 -0
  67. package/src/api/oracles/{ID}.js +100 -0
  68. package/src/api/oracles.js +96 -0
  69. package/src/api/participants/{ID}/error.js +44 -0
  70. package/src/api/participants/{ID}.js +44 -0
  71. package/src/api/participants/{Type}/{ID}/error.js +74 -0
  72. package/src/api/participants/{Type}/{ID}/{SubId}/error.js +68 -0
  73. package/src/api/participants/{Type}/{ID}/{SubId}.js +113 -0
  74. package/src/api/participants/{Type}/{ID}.js +133 -0
  75. package/src/api/participants.js +63 -0
  76. package/src/api/parties/{Type}/{ID}/error.js +66 -0
  77. package/src/api/parties/{Type}/{ID}/{SubId}/error.js +56 -0
  78. package/src/api/parties/{Type}/{ID}/{SubId}.js +77 -0
  79. package/src/api/parties/{Type}/{ID}.js +98 -0
  80. package/src/api/routes.js +294 -0
  81. package/src/constants.js +16 -0
  82. package/src/domain/oracle/index.js +33 -0
  83. package/src/domain/oracle/oracle.js +234 -0
  84. package/src/domain/participants/index.js +35 -0
  85. package/src/domain/participants/participants.js +560 -0
  86. package/src/domain/parties/getPartiesByTypeAndID.js +239 -0
  87. package/src/domain/parties/index.js +32 -0
  88. package/src/domain/parties/parties.js +215 -0
  89. package/src/domain/parties/utils.js +84 -0
  90. package/src/domain/timeout/dto.js +48 -0
  91. package/src/domain/timeout/index.js +104 -0
  92. package/src/handlers/TimeoutHandler.js +94 -0
  93. package/src/handlers/index.js +70 -0
  94. package/src/handlers/monitoring/index.js +51 -0
  95. package/src/handlers/monitoring/plugins/health.js +61 -0
  96. package/src/handlers/monitoring/plugins/metrics.js +48 -0
  97. package/src/handlers/register.js +102 -0
  98. package/src/index.js +66 -0
  99. package/src/interface/admin-swagger.yaml +804 -0
  100. package/src/interface/admin_swagger.json +959 -0
  101. package/src/interface/api-swagger-iso20022-parties.yaml +1734 -0
  102. package/src/interface/api-swagger.yaml +1733 -0
  103. package/src/interface/api_swagger.json +3046 -0
  104. package/src/interface/fspiop-rest-v2.0-ISO20022_parties.yaml +2256 -0
  105. package/src/interface/thirdparty/admin-swagger.yaml +808 -0
  106. package/src/interface/thirdparty/admin_swagger.json +961 -0
  107. package/src/interface/thirdparty/api-swagger.yaml +1739 -0
  108. package/src/interface/thirdparty/api_swagger.json +3142 -0
  109. package/src/lib/argv.js +39 -0
  110. package/src/lib/cache.js +126 -0
  111. package/src/lib/config.js +183 -0
  112. package/src/lib/db.js +26 -0
  113. package/src/lib/headers.js +53 -0
  114. package/src/lib/healthCheck/subServiceHealth.js +84 -0
  115. package/src/lib/index.js +11 -0
  116. package/src/lib/migrator.js +17 -0
  117. package/src/lib/requestLogger.js +54 -0
  118. package/src/lib/util.js +66 -0
  119. package/src/metrics/handler.js +33 -0
  120. package/src/metrics/plugin.js +52 -0
  121. package/src/metrics/routes.js +43 -0
  122. package/src/models/currency/currency.js +48 -0
  123. package/src/models/currency/index.js +32 -0
  124. package/src/models/endpointType/endpointType.js +48 -0
  125. package/src/models/endpointType/index.js +32 -0
  126. package/src/models/misc/migrationLock.js +49 -0
  127. package/src/models/oracle/facade.js +341 -0
  128. package/src/models/oracle/index.js +41 -0
  129. package/src/models/oracle/oracleEndpoint.js +192 -0
  130. package/src/models/oracle/oracleEndpointCached.js +108 -0
  131. package/src/models/participantEndpoint/facade.js +238 -0
  132. package/src/models/partyIdType/index.js +32 -0
  133. package/src/models/partyIdType/partyIdType.js +41 -0
  134. package/src/plugins.js +139 -0
  135. package/src/server.js +199 -0
  136. package/test/fixtures/index.js +131 -0
  137. package/test/fixtures/iso.js +110 -0
  138. package/test/integration/.env +8 -0
  139. package/test/integration/api/parties.test.js +137 -0
  140. package/test/integration/constants.js +20 -0
  141. package/test/integration/domain/oracle/index.test.js +324 -0
  142. package/test/integration/domain/timeout/index.test.js +75 -0
  143. package/test/integration/env.sh +15 -0
  144. package/test/integration/example.test.js +12 -0
  145. package/test/integration/models/currency/currency.test.js +68 -0
  146. package/test/integration/plugins.test.js +62 -0
  147. package/test/integration/prepareTestParticipants.js +30 -0
  148. package/test/integration/setup.js +5 -0
  149. package/test/integration-config.json +81 -0
  150. package/test/integration-runner.sh +108 -0
  151. package/test/unit/api/health.test.js +142 -0
  152. package/test/unit/api/oracles/{ID}.test.js +264 -0
  153. package/test/unit/api/oracles.test.js +173 -0
  154. package/test/unit/api/participants/participants.test.js +117 -0
  155. package/test/unit/api/participants/{Type}/{ID}/error.test.js +155 -0
  156. package/test/unit/api/participants/{Type}/{ID}/{SubId}/error.test.js +131 -0
  157. package/test/unit/api/participants/{Type}/{ID}/{SubId}.test.js +377 -0
  158. package/test/unit/api/participants/{Type}/{ID}.test.js +383 -0
  159. package/test/unit/api/participants.test.js +108 -0
  160. package/test/unit/api/parties/endpointcache.test.js +83 -0
  161. package/test/unit/api/parties/parties.test.js +102 -0
  162. package/test/unit/api/parties/{Type}/{ID}/error.test.js +145 -0
  163. package/test/unit/api/parties/{Type}/{ID}/{SubId}/error.test.js +141 -0
  164. package/test/unit/api/parties/{Type}/{ID}/{SubId}.test.js +241 -0
  165. package/test/unit/api/parties/{Type}/{ID}.test.js +240 -0
  166. package/test/unit/domain/oracle/oracle.test.js +505 -0
  167. package/test/unit/domain/participants/participants.test.js +1724 -0
  168. package/test/unit/domain/parties/parties.test.js +940 -0
  169. package/test/unit/domain/timeout/dto.test.js +28 -0
  170. package/test/unit/domain/timeout/index.test.js +81 -0
  171. package/test/unit/handlers/TimeoutHandler.test.js +125 -0
  172. package/test/unit/handlers/index.test.js +56 -0
  173. package/test/unit/handlers/register.test.js +90 -0
  174. package/test/unit/index.test.js +139 -0
  175. package/test/unit/iso20022/partiesValidation.test.js +129 -0
  176. package/test/unit/lib/TransformFacades.test.js +18 -0
  177. package/test/unit/lib/argv.test.js +40 -0
  178. package/test/unit/lib/cache.test.js +172 -0
  179. package/test/unit/lib/config.test.js +108 -0
  180. package/test/unit/lib/healthCheck/subServiceHealth.test.js +89 -0
  181. package/test/unit/lib/migrator.test.js +52 -0
  182. package/test/unit/lib/requestLogger.test.js +115 -0
  183. package/test/unit/lib/util.test.js +68 -0
  184. package/test/unit/mocks.js +66 -0
  185. package/test/unit/models/currency/currency.test.js +91 -0
  186. package/test/unit/models/endpointType/endpointType.test.js +69 -0
  187. package/test/unit/models/misc/migrationLock.test.js +96 -0
  188. package/test/unit/models/oracle/facade.test.js +546 -0
  189. package/test/unit/models/oracle/oracleEndpoint.test.js +409 -0
  190. package/test/unit/models/oracle/oracleEndpointCached.test.js +153 -0
  191. package/test/unit/models/participantEndpoint/facade.test.js +295 -0
  192. package/test/unit/models/partyIdType/partyIdType.test.js +88 -0
  193. package/test/unit/plugins.test.js +89 -0
  194. package/test/unit/setup.js +7 -0
  195. package/test/util/apiClients/AlsApiClient.js +44 -0
  196. package/test/util/apiClients/BasicApiClient.js +34 -0
  197. package/test/util/apiClients/ProxyApiClient.js +25 -0
  198. package/test/util/apiClients/index.js +7 -0
  199. package/test/util/helper.js +332 -0
  200. package/test/util/index.js +11 -0
  201. package/test/util/mockgen.js +43 -0
  202. package/test/util/onboarding.js +132 -0
  203. package/test/util/scripts/addAlsDb.sh +33 -0
  204. package/test/util/scripts/configureMockServer.sh +35 -0
  205. package/test/util/scripts/env.sh +19 -0
  206. package/test/util/scripts/populateTestData.sh +62 -0
  207. package/test/util/scripts/startMockCentralServer.sh +45 -0
  208. package/test/util/scripts/startMockOracleServer.sh +45 -0
  209. package/test/util/testConfig.js +44 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "mock-proxy",
3
+ "version": "0.1.0",
4
+ "description": "Mock proxy adapter",
5
+ "author": "Eugen Klymniuk (geka-evk)",
6
+ "license": "Apache-2.0",
7
+ "main": "src/server.ts",
8
+ "scripts": {
9
+ "start": "ts-node src/server.ts"
10
+ },
11
+ "dependencies": {
12
+ "@mojaloop/central-services-shared": "^18.6.0-snapshot.4",
13
+ "@types/node": "^20.14.2",
14
+ "axios": "^1.7.2",
15
+ "body-parser": "^1.20.2",
16
+ "express": "^4.19.2",
17
+ "ts-node": "^10.9.2",
18
+ "typescript": "^5.4.5"
19
+ },
20
+ "devDependencies": {
21
+ "@types/body-parser": "^1.19.5",
22
+ "@types/express": "^4.17.21"
23
+ }
24
+ }
@@ -0,0 +1,14 @@
1
+ import process from 'node:process';
2
+
3
+ console.log('process.env:', process.env);
4
+
5
+ export const {
6
+ PROXY_PORT = 14200,
7
+ PROXY_NAME = 'proxyAB',
8
+ CL_HOST = 'localhost',
9
+ CL_PORT = 3001,
10
+ } = process.env;
11
+
12
+ export const ROUTES = {
13
+ history: '/history',
14
+ } as const;
@@ -0,0 +1,94 @@
1
+ import http from 'node:http';
2
+ import * as console from 'node:console';
3
+ import express, { Request, Response, NextFunction } from 'express';
4
+ import bodyParser from 'body-parser';
5
+
6
+ import { PROXY_PORT, PROXY_NAME, ROUTES, CL_HOST, CL_PORT } from './config';
7
+ import { hubCbHeaders, dfspCbHeaders } from './utils';
8
+
9
+ const app = express();
10
+ app.use(bodyParser.json());
11
+ app.use(bodyParser.urlencoded({ extended: true }));
12
+
13
+ const history: Record<string, unknown>[] = [];
14
+
15
+ app.all('*', (req: Request, res: Response, next: NextFunction) => {
16
+ const { path, method, headers, body, params, query } = req;
17
+ const reqDetails = { path, method, headers, body, params, query }
18
+ console.log(`[==>] [${new Date().toISOString()}] incoming request...`, reqDetails);
19
+
20
+ if (path !== ROUTES.history) {
21
+ history.push(reqDetails);
22
+ }
23
+ next();
24
+ });
25
+
26
+ app.get(ROUTES.history, (req: Request, res: Response) => {
27
+ res.json({ history });
28
+ });
29
+ app.delete(ROUTES.history, (req: Request, res: Response) => {
30
+ history.length = 0
31
+ res.json({ history });
32
+ });
33
+
34
+ app.get('/health', (req: Request, res: Response) => {
35
+ res.json({ success: true });
36
+ });
37
+
38
+ app.get('/parties/:type/:id', (req: Request, res: Response) => {
39
+ const { type, id } = req.params;
40
+ const headers = hubCbHeaders(req.headers);
41
+ console.log('parties request details:', { type, id, headers, CL_HOST, CL_PORT });
42
+
43
+ // todo: reply to CL with party info
44
+
45
+ res
46
+ .set(headers)
47
+ .status(202)
48
+ .json({ success: true });
49
+ });
50
+
51
+ app.put('/parties/:type/:id/error', (req: Request, res: Response) => {
52
+ const { type, id } = req.params;
53
+ const headers = dfspCbHeaders(req.headers);
54
+ console.log('parties put error request details:', { type, id, headers, CL_HOST, CL_PORT });
55
+
56
+ res
57
+ .set(headers)
58
+ .status(200)
59
+ .json({ success: true });
60
+ });
61
+
62
+ app.get('/oracle*', (req: Request, res: Response) => {
63
+ // console.log('oracle request details:', { type, id, headers });
64
+ const data = {
65
+ partyList: []
66
+ }
67
+ res.json({ data });
68
+ });
69
+
70
+ app.all('/echo', async (req: Request, res: Response) => {
71
+ const input = {
72
+ method: req.method,
73
+ path: req.path,
74
+ headers: req.headers,
75
+ query: req.query,
76
+ body: req.body,
77
+ };
78
+ console.log('incoming request...', input);
79
+
80
+ res.set(hubCbHeaders).json(input);
81
+ });
82
+
83
+ app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
84
+ const { message, stack, cause } = err;
85
+ const response = { message, stack, cause };
86
+ console.error('error response:', response);
87
+ res.status(500).json(response);
88
+ });
89
+
90
+ const httpsServer = http.createServer(app);
91
+
92
+ httpsServer.listen(PROXY_PORT, () => {
93
+ console.log(`Mock proxyAdapter "${PROXY_NAME}" is running on port ${PROXY_PORT}...`);
94
+ });
@@ -0,0 +1,29 @@
1
+ import { IncomingHttpHeaders } from 'node:http';
2
+ import { Enum } from '@mojaloop/central-services-shared';
3
+ import { PROXY_NAME } from './config';
4
+
5
+ const { Headers} = Enum.Http
6
+
7
+ export const hubCbHeaders = (headers: IncomingHttpHeaders) => {
8
+ const {
9
+ [Headers.FSPIOP.SOURCE]: source,
10
+ [Headers.FSPIOP.DESTINATION]: destination,
11
+ host,
12
+ 'content-length': _,
13
+ ...restHeaders
14
+ } = headers;
15
+
16
+ return {
17
+ ...restHeaders,
18
+ [Headers.FSPIOP.SOURCE]: destination,
19
+ [Headers.FSPIOP.DESTINATION]: source,
20
+ [Headers.FSPIOP.PROXY]: PROXY_NAME,
21
+ };
22
+ };
23
+
24
+ export const dfspCbHeaders = (headers: IncomingHttpHeaders) => {
25
+ const h = hubCbHeaders(headers);
26
+ delete h[Headers.FSPIOP.PROXY];
27
+
28
+ return h;
29
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": "./",
4
+ "rootDir": "./src",
5
+ "outDir": "./dist",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "noImplicitAny": true,
9
+ "lib": ["esNext"],
10
+ "target": "esNext",
11
+ "module": "nodeNext",
12
+ "moduleResolution": "nodeNext",
13
+ "esModuleInterop": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "allowSyntheticDefaultImports": true,
16
+ "skipLibCheck": true,
17
+ "resolveJsonModule": true,
18
+ "sourceMap": true,
19
+ "declaration": true,
20
+ "declarationMap": true
21
+ },
22
+ "include": ["./src"],
23
+ "exclude": ["node_modules"]
24
+ }
@@ -0,0 +1,2 @@
1
+ ALTER USER 'account_lookup'@'%' identified WITH mysql_native_password by 'password';
2
+ FLUSH PRIVILEGES;
@@ -0,0 +1,2 @@
1
+ ALTER USER 'central_ledger'@'%' identified WITH mysql_native_password by 'password';
2
+ FLUSH PRIVILEGES;
@@ -0,0 +1,10 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for Account Lookup Service..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ sh /opt/wait-for/wait-for-mysql-als.sh
8
+ sh /opt/wait-for/wait-for-mysql-central-ledger.sh
9
+
10
+ echo "** STARTUP - Account Lookup Service successful!"
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for Central-Ledger..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ sh /opt/wait-for/wait-for-mysql-central-ledger.sh
8
+
9
+ sh /opt/wait-for/wait-for-kafka.sh
10
+
11
+ echo "** STARTUP - Central-Ledger successful!"
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for Broker connection..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ sh /opt/wait-for/wait-for.sh $WAIT_FOR_DB_KAFKA_BROKER -t 240 -- echo "** STARTUP - Kafka connection successful!"
@@ -0,0 +1,9 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for ML-API-Adapter..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ sh /opt/wait-for/wait-for-kafka.sh
8
+
9
+ echo "** STARTUP - ML-API-Adapter successful!"
@@ -0,0 +1,20 @@
1
+ #!/bin/sh
2
+ # wait-for-mockserver.sh
3
+
4
+ source /opt/wait-for/wait-for.env
5
+
6
+ function healthCheck() {
7
+ curl -s -X GET "http://$WAIT_FOR_MOCK_HOST:$WAIT_FOR_MOCK_PORT"
8
+ }
9
+
10
+ function command() {
11
+ curl -s -X PUT "http://$WAIT_FOR_MOCK_HOST:$WAIT_FOR_MOCK_PORT/expectation" -d '{ "httpRequest": { "method": ".*", "path": "/.*transfers.*" }, "times" : { "remainingTimes" : 0, "unlimited" : true }, "timeToLive" : { "unlimited" : true }, "httpResponse": { "statusCode": 200, "body": "{}" } }';
12
+ }
13
+
14
+ until healthCheck; do
15
+ >&2 echo "mockserver is unavailable - sleeping"
16
+ sleep 1
17
+ done
18
+
19
+ >&2 echo "mockserver is up - executing command"
20
+ command
@@ -0,0 +1,14 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for DB connection..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ apk --no-cache add mysql-client
8
+
9
+ until result=$(mysql -h $WAIT_FOR_DB_HOST_ALS -P $WAIT_FOR_DB_PORT_ALS -u $WAIT_FOR_DB_USER_ALS --password=$WAIT_FOR_DB_PASSWORD_ALS $WAIT_FOR_DB_DATABASE_ALS -ss -N -e 'select 1;') \
10
+ && eval 'echo is_connected=$result' \
11
+ && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2;
12
+ done;
13
+
14
+ echo "** STARTUP - DB connection successful!"
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for DB connection..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ apk --no-cache add mysql-client
8
+
9
+ until result=$(mysql -h $WAIT_FOR_DB_HOST_CL -P $WAIT_FOR_DB_PORT_CL -u $WAIT_FOR_DB_USER_CL --password=$WAIT_FOR_DB_PASSWORD_CL $WAIT_FOR_DB_DATABASE_CL -ss -N -e 'select 1;') && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2; done;
10
+
11
+ echo "** STARTUP - DB connection successful!"
@@ -0,0 +1,11 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for DB connection..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ apk --no-cache add mysql-client
8
+
9
+ until result=$(mysql -h $WAIT_FOR_DB_HOST -P $WAIT_FOR_DB_PORT -u $WAIT_FOR_DB_USER --password=$WAIT_FOR_DB_PASSWORD $WAIT_FOR_DB_DATABASE -ss -N -e 'select 1;') && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for MySQL; sleep 2; done;
10
+
11
+ echo "** STARTUP - DB connection successful!"
@@ -0,0 +1,12 @@
1
+ #!/bin/sh
2
+
3
+ echo "** STARTUP - Checking for Object Store connection..."
4
+
5
+ source /opt/wait-for/wait-for.env
6
+
7
+ apk add --no-cache mongodb
8
+
9
+ #sh /opt/wait-for/wait-for.sh objstore:1080 -- echo "** STARTUP - Object Store connection successful!"
10
+ until result=$(mongo $WAIT_FOR_DB_OBJSTORE_URI --eval "db.adminCommand('ping')") && eval 'echo is_connected=$result' && if [ -z $result ]; then false; fi && if [ $result -ne 1 ]; then false; fi; do echo waiting for ObjStore; sleep 2; done;
11
+
12
+ echo "** STARTUP - Object Store connection successful!"
@@ -0,0 +1,18 @@
1
+ # Environment config for wait-for scripts
2
+
3
+ WAIT_FOR_DB_HOST_CL=mysql-cl
4
+ WAIT_FOR_DB_PORT_CL=3306
5
+ WAIT_FOR_DB_USER_CL=central_ledger
6
+ WAIT_FOR_DB_PASSWORD_CL=password
7
+ WAIT_FOR_DB_DATABASE_CL=central_ledger
8
+
9
+ WAIT_FOR_DB_HOST_ALS=mysql-als
10
+ WAIT_FOR_DB_PORT_ALS=3306
11
+ WAIT_FOR_DB_USER_ALS=account_lookup
12
+ WAIT_FOR_DB_PASSWORD_ALS=password
13
+ WAIT_FOR_DB_DATABASE_ALS=account_lookup
14
+
15
+ WAIT_FOR_DB_OBJSTORE_URI=mongodb://objstore:27017/mlos
16
+ WAIT_FOR_DB_KAFKA_BROKER=kafka:29092
17
+ WAIT_FOR_MOCK_HOST=mockserver
18
+ WAIT_FOR_MOCK_PORT=1080
@@ -0,0 +1,81 @@
1
+ #!/bin/sh
2
+
3
+ # Script from https://github.com/eficode/wait-for
4
+
5
+ TIMEOUT=15
6
+ QUIET=0
7
+
8
+ echoerr() {
9
+ if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
10
+ }
11
+
12
+ usage() {
13
+ exitcode="$1"
14
+ cat << USAGE >&2
15
+ Usage:
16
+ $cmdname host:port [-t timeout] [-- command args]
17
+ -q | --quiet Do not output any status messages
18
+ -t TIMEOUT | --timeout=timeout Timeout in seconds, zero for no timeout
19
+ -- COMMAND ARGS Execute command with args after the test finishes
20
+ USAGE
21
+ exit "$exitcode"
22
+ }
23
+
24
+ wait_for() {
25
+ for i in `seq $TIMEOUT` ; do
26
+ nc -z "$HOST" "$PORT" > /dev/null 2>&1
27
+
28
+ result=$?
29
+ if [ $result -eq 0 ] ; then
30
+ if [ $# -gt 0 ] ; then
31
+ exec "$@"
32
+ fi
33
+ exit 0
34
+ fi
35
+ sleep 1
36
+ done
37
+ echo "Operation timed out" >&2
38
+ exit 1
39
+ }
40
+
41
+ while [ $# -gt 0 ]
42
+ do
43
+ case "$1" in
44
+ *:* )
45
+ HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
46
+ PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
47
+ shift 1
48
+ ;;
49
+ -q | --quiet)
50
+ QUIET=1
51
+ shift 1
52
+ ;;
53
+ -t)
54
+ TIMEOUT="$2"
55
+ if [ "$TIMEOUT" = "" ]; then break; fi
56
+ shift 2
57
+ ;;
58
+ --timeout=*)
59
+ TIMEOUT="${1#*=}"
60
+ shift 1
61
+ ;;
62
+ --)
63
+ shift
64
+ break
65
+ ;;
66
+ --help)
67
+ usage 0
68
+ ;;
69
+ *)
70
+ echoerr "Unknown argument: $1"
71
+ usage 1
72
+ ;;
73
+ esac
74
+ done
75
+
76
+ if [ "$HOST" = "" -o "$PORT" = "" ]; then
77
+ echoerr "Error: you need to provide a host and port to test."
78
+ usage 2
79
+ fi
80
+
81
+ wait_for "$@"
@@ -0,0 +1,29 @@
1
+ version: "3.7"
2
+
3
+ services:
4
+ account-lookup-service-int:
5
+ image: mojaloop/account-lookup-service-int:local
6
+ build:
7
+ context: .
8
+ target: builder
9
+ cache_from:
10
+ - mojaloop/account-lookup-service
11
+ - account-lookup-service
12
+ container_name: als_account-lookup-service-int
13
+ user: root
14
+ networks:
15
+ - als-mojaloop-net
16
+ command:
17
+ - sh
18
+ - -c
19
+ - "tail -f /dev/null"
20
+ depends_on:
21
+ - mysql-als
22
+ - central-ledger
23
+ volumes:
24
+ - ./src:/opt/app/src
25
+ - ./secrets:/opt/app/secrets
26
+ - ./test:/opt/app/test
27
+ - ./package.json:/opt/app/package.json
28
+ - ./test/integration-config.json:/opt/app/config/default.json
29
+ - ./docker/wait-for:/opt/wait-for
@@ -0,0 +1,243 @@
1
+ networks:
2
+ als-mojaloop-net:
3
+ name: als-mojaloop-net
4
+
5
+ # @see https://uninterrupted.tech/blog/hassle-free-redis-cluster-deployment-using-docker/
6
+ x-redis-node: &REDIS_NODE
7
+ image: docker.io/bitnami/redis-cluster:6.2.14
8
+ environment: &REDIS_ENVS
9
+ ALLOW_EMPTY_PASSWORD: yes
10
+ REDIS_CLUSTER_DYNAMIC_IPS: no
11
+ REDIS_CLUSTER_ANNOUNCE_IP: ${REDIS_CLUSTER_ANNOUNCE_IP}
12
+ REDIS_NODES: localhost:6379 localhost:6380 localhost:6381 localhost:6382 localhost:6383 localhost:6384
13
+ healthcheck:
14
+ test: [ "CMD", "redis-cli", "ping" ]
15
+ timeout: 2s
16
+ network_mode: host
17
+
18
+ x-account-lookup-service: &ACCOUNT_LOOKUP_SERVICE
19
+ image: mojaloop/account-lookup-service:local
20
+ build:
21
+ context: .
22
+ target: builder
23
+ user: root
24
+ environment:
25
+ LOG_LEVEL: debug
26
+ networks:
27
+ - als-mojaloop-net
28
+ depends_on:
29
+ - central-ledger
30
+ - proxy
31
+ - mysql-als
32
+ - redis-node-0
33
+ # - redis
34
+ volumes:
35
+ - ./secrets:/opt/app/secrets
36
+ - ./src:/opt/app/src
37
+ - ./docker/account-lookup-service/default.json:/opt/app/config/default.json
38
+ - ./docker/wait-for:/opt/wait-for
39
+ extra_hosts:
40
+ - "redis-node-0:host-gateway"
41
+
42
+ services:
43
+ account-lookup-service:
44
+ <<: *ACCOUNT_LOOKUP_SERVICE
45
+ container_name: als_account-lookup-service
46
+ command:
47
+ - "sh"
48
+ - "-c"
49
+ - "sh /opt/wait-for/wait-for-account-lookup-service.sh && node src/index.js server"
50
+ ports:
51
+ - "4001:4001"
52
+ - "4002:4002"
53
+ healthcheck:
54
+ test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:4001/health"]
55
+ timeout: 20s
56
+ retries: 10
57
+ interval: 30s
58
+
59
+ account-lookup-service-handlers:
60
+ <<: *ACCOUNT_LOOKUP_SERVICE
61
+ container_name: als_account-lookup-service-handlers
62
+ command:
63
+ - "sh"
64
+ - "-c"
65
+ - "node src/handlers/index.js h --timeout"
66
+ depends_on:
67
+ - redis-node-0
68
+ ports:
69
+ - "4003:4003"
70
+ healthcheck:
71
+ test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:4003/health"]
72
+ timeout: 20s
73
+ retries: 10
74
+ interval: 30s
75
+
76
+ central-ledger:
77
+ # image: mojaloop/central-ledger:latest
78
+ image: mojaloop/central-ledger:v17.8.0-snapshot.34
79
+ container_name: als_central-ledger
80
+ user: root
81
+ command:
82
+ - "sh"
83
+ - "-c"
84
+ - "sh /opt/wait-for/wait-for-central-ledger.sh && node src/api/index.js"
85
+ ports:
86
+ - "${CL_PORT:-3001}:3001"
87
+ volumes:
88
+ - ./docker/central-ledger/default.json:/opt/app/config/default.json
89
+ - ./docker/wait-for:/opt/wait-for
90
+ environment:
91
+ - LOG_LEVEL=debug
92
+ - CLEDG_DATABASE_URI=mysql://central_ledger:password@mysql-cl:3306/central_ledger
93
+ - CLEDG_SIDECAR__DISABLED=true
94
+ - CLEDG_MONGODB__DISABLED=true
95
+ networks:
96
+ - als-mojaloop-net
97
+ depends_on:
98
+ - mysql-cl
99
+ - kafka
100
+ - redis-node-0
101
+ extra_hosts:
102
+ - "redis-node-0:host-gateway"
103
+ healthcheck:
104
+ test: ["CMD", "sh", "-c" ,"apk --no-cache add curl", ";", "curl", "http://localhost:3001/health"]
105
+ timeout: 20s
106
+ retries: 10
107
+ interval: 30s
108
+
109
+ proxy:
110
+ build:
111
+ context: ./docker/mock-proxy
112
+ dockerfile: Dockerfile
113
+ restart: always
114
+ env_file: ./test/integration/.env
115
+ ports:
116
+ - "${PROXY_PORT}:${PROXY_PORT}"
117
+ networks:
118
+ - als-mojaloop-net
119
+
120
+ kafka:
121
+ image: johnnypark/kafka-zookeeper:2.3.0
122
+ container_name: als_kafka
123
+ volumes:
124
+ - ./docker/kafka/:/opt/kafka_2.12-2.3.0/config/
125
+ ports:
126
+ - "2181:2181"
127
+ - "9092:9092"
128
+ environment:
129
+ - ZOO_LOG4J_PROP=WARN
130
+ networks:
131
+ - als-mojaloop-net
132
+ healthcheck:
133
+ test: ["CMD", "/opt/kafka_2.12-2.3.0/bin/kafka-broker-api-versions.sh", "--bootstrap-server", "kafka:29092"]
134
+ timeout: 20s
135
+ retries: 10
136
+ start_period: 40s
137
+ interval: 30s
138
+
139
+ mysql-als:
140
+ image: mysql/mysql-server
141
+ container_name: als_mysql
142
+ ports:
143
+ - "3306:3306"
144
+ volumes:
145
+ - ./docker/sql-init/:/docker-entrypoint-initdb.d/
146
+ environment:
147
+ - MYSQL_USER=${DBUSER:-account_lookup}
148
+ - MYSQL_PASSWORD=${DBPASS:-password}
149
+ - MYSQL_DATABASE=${DBUSER:-account_lookup}
150
+ - MYSQL_ALLOW_EMPTY_PASSWORD=true
151
+ networks:
152
+ - als-mojaloop-net
153
+ healthcheck:
154
+ test: ["CMD", "mysqladmin" ,"ping", "-h", "mysql-als"]
155
+ timeout: 20s
156
+ retries: 10
157
+ start_period: 40s
158
+ interval: 30s
159
+
160
+ mysql-cl:
161
+ image: mysql/mysql-server
162
+ container_name: als_mysql_central_ledger
163
+ ports:
164
+ - "3307:3306"
165
+ volumes:
166
+ - ./docker/sql-init-central-ledger/:/docker-entrypoint-initdb.d/
167
+ environment:
168
+ - MYSQL_USER=${DBUSER:-central_ledger}
169
+ - MYSQL_PASSWORD=${DBPASS:-password}
170
+ - MYSQL_DATABASE=${DBUSER:-central_ledger}
171
+ - MYSQL_ALLOW_EMPTY_PASSWORD=true
172
+ networks:
173
+ - als-mojaloop-net
174
+ healthcheck:
175
+ test: ["CMD", "mysqladmin" ,"ping", "-h", "mysql-cl"]
176
+ timeout: 20s
177
+ retries: 10
178
+ start_period: 40s
179
+ interval: 30s
180
+
181
+ redis-node-0:
182
+ <<: *REDIS_NODE
183
+ environment:
184
+ <<: *REDIS_ENVS
185
+ REDIS_CLUSTER_CREATOR: yes
186
+ REDIS_PORT_NUMBER: 6379
187
+ depends_on:
188
+ - redis-node-1
189
+ - redis-node-2
190
+ - redis-node-3
191
+ - redis-node-4
192
+ - redis-node-5
193
+ redis-node-1:
194
+ <<: *REDIS_NODE
195
+ environment:
196
+ <<: *REDIS_ENVS
197
+ REDIS_PORT_NUMBER: 6380
198
+ ports:
199
+ - "16380:16380"
200
+ redis-node-2:
201
+ <<: *REDIS_NODE
202
+ environment:
203
+ <<: *REDIS_ENVS
204
+ REDIS_PORT_NUMBER: 6381
205
+ ports:
206
+ - "16381:16381"
207
+ redis-node-3:
208
+ <<: *REDIS_NODE
209
+ environment:
210
+ <<: *REDIS_ENVS
211
+ REDIS_PORT_NUMBER: 6382
212
+ ports:
213
+ - "16382:16382"
214
+ redis-node-4:
215
+ <<: *REDIS_NODE
216
+ environment:
217
+ <<: *REDIS_ENVS
218
+ REDIS_PORT_NUMBER: 6383
219
+ ports:
220
+ - "16383:16383"
221
+ redis-node-5:
222
+ <<: *REDIS_NODE
223
+ environment:
224
+ <<: *REDIS_ENVS
225
+ REDIS_PORT_NUMBER: 6384
226
+ ports:
227
+ - "16384:16384"
228
+
229
+ ## To be used with proxyCache.type === 'redis'
230
+ # redis:
231
+ # image: redis:6.2.4-alpine
232
+ # restart: "unless-stopped"
233
+ # environment:
234
+ # <<: *REDIS_ENVS
235
+ # REDIS_CLUSTER_CREATOR: yes
236
+ # depends_on:
237
+ # - redis-node-1
238
+ # - redis-node-2
239
+ # - redis-node-3
240
+ # - redis-node-4
241
+ # - redis-node-5
242
+ # ports:
243
+ # - "6379:6379"